C++ Tutorial/Class/polymorphism
Use virtual functions and polymorphism.
<source lang="cpp">#include <iostream>
- include <cstring>
using namespace std;
class Shape {
double width; double height; char name[20];
public:
Shape() { width = height = 0.0; strcpy(name, "unknown"); } Shape(double w, double h, char *n) { width = w; height = h; strcpy(name, n); } Shape(double x, char *n) { width = height = x; strcpy(name, n); } void display() { cout << "Width and height are " << width << " and " << height << "\n"; } double getWidth() { return width; } double getHeight() { return height; } void setWidth(double w) { width = w; } void setHeight(double h) { height = h; } char *getName() { return name; } virtual double area() { cout << "Error: area() must be overridden.\n"; return 0.0; }
};
class Triangle : public Shape {
char style[20];
public:
Triangle() { strcpy(style, "unknown"); } Triangle(char *str, double w, double h) : Shape(w, h, "triangle") { strcpy(style, str); } Triangle(double x) : Shape(x, "triangle") { strcpy(style, "isosceles"); } double area() { return getWidth() * getHeight() / 2; } void showStyle() { cout << "Triangle is " << style << "\n"; }
};
class Rectangle : public Shape { public:
Rectangle(double w, double h) : Shape(w, h, "rectangle") { } Rectangle(double x) : Shape(x, "rectangle") { } bool isSquare() { if(getWidth() == getHeight()) return true; return false; } double area() { return getWidth() * getHeight(); }
};
int main() {
Shape *shapes[5]; shapes[0] = &Triangle("right", 8.0, 12.0); shapes[1] = &Rectangle(10); shapes[2] = &Rectangle(10, 4); shapes[3] = &Triangle(7.0); shapes[4] = &Shape(10, 20, "generic"); for(int i=0; i < 5; i++) { cout << "object is " << shapes[i]->getName() << "\n"; cout << "Area is " << shapes[i]->area() << "\n\n"; } return 0;
}</source>
object is generic Error: area() must be overridden. Area is 0 object is generic Error: area() must be overridden. Area is 0 object is generic Error: area() must be overridden. Area is 0 object is generic Error: area() must be overridden. Area is 0 object is generic Error: area() must be overridden. Area is 0