C++ Tutorial/Class/polymorphism

Материал из C\C++ эксперт
Перейти к: навигация, поиск

Use virtual functions and polymorphism.

<source lang="cpp">#include <iostream>

  1. 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