Mega Code Archive

 
Categories / C++ / Class
 

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;  }