Use virtual functions and polymorphism.
#include <iostream> #include <cstring> using namespace std; class TwoDimensionShape { double width; double height; char name[20]; public: TwoDimensionShape() { width = height = 0.0; strcpy(name, "unknown"); } TwoDimensionShape(double w, double h, char *n) { width = w; height = h; strcpy(name, n); } TwoDimensionShape(double x, char *n) { width = height = x; strcpy(name, n); } void showDim() { cout << "Width and height are " << width << " and " << height << endl; } 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 TwoDimensionShape { char style[20]; // now private public: Triangle() { strcpy(style, "unknown"); } Triangle(char *str, double w, double h) : TwoDimensionShape(w, h, "triangle") { strcpy(style, str); } Triangle(double x) : TwoDimensionShape(x, "triangle") { strcpy(style, "isosceles"); } double area() { return getWidth() * getHeight() / 2; } void showStyle() { cout << "Triangle is " << style << endl; } }; class Rectangle : public TwoDimensionShape { public: Rectangle(double w, double h) : TwoDimensionShape(w, h, "rectangle") { } Rectangle(double x) : TwoDimensionShape(x, "rectangle") { } bool isSquare() { if(getWidth() == getHeight()) return true; return false; } // This is another override of area(). double area() { return getWidth() * getHeight(); } }; int main() { TwoDimensionShape *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] = &TwoDimensionShape(10, 20, "generic"); for(int i = 0; i < 5; i++) { cout << "object is " << shapes[i]->getName() << endl; cout << "Area is " << shapes[i]->area() << endl; cout << endl; } return 0; }
1. | Object array: polymorphism. | ||
2. | An example that uses typeid on a polymorphic class hierarchy | ||
3. | Polymorphism with base class pointer | ||
4. | dynamic allocation and polymorphism |