Наследование, виртуальные функции и полиморфизм:
Код:
#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;
}