C++/Class/Polymorphism

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

An example that uses typeid on a polymorphic class hierarchy

<source lang="cpp">

  1. include <iostream>
  2. include <typeinfo>

using namespace std; class Mammal { public:

 virtual bool laysEggs() { 
   return false; 
 }

}; class Cat: public Mammal { public: }; class Platypus: public Mammal { public:

 bool laysEggs() { 
   return true; 
 }

}; int main() {

 Mammal *p, AnyMammal;
 Cat cat;
 Platypus platypus;
 p = &AnyMammal;
 cout << "p is pointing to an object of type ";
 cout << typeid(*p).name() << endl;
 p = &cat;
 cout << "p is pointing to an object of type ";
 cout << typeid(*p).name() << endl;
 p = &platypus;
 cout << "p is pointing to an object of type ";
 cout << typeid(*p).name() << endl;
 return 0;

}


 </source>


dynamic allocation and polymorphism

<source lang="cpp">

  1. include <iostream>

using namespace std; class CPolygon {

 protected:
   int width, height;
 public:
   void set_values (int a, int b)
   { width=a; height=b; }
   virtual int area (void) =0;
   void printarea (void)
   { cout << this->area() << endl; }
 };

class CRectangle: public CPolygon {

 public:
   int area (void)
   { return (width * height); }

}; class CTriangle: public CPolygon {

 public:
   int area (void)
   { return (width * height / 2); }

}; int main () {

 CPolygon * ppoly1 = new CRectangle;
 CPolygon * ppoly2 = new CTriangle;
 ppoly1->set_values (4,5);
 ppoly2->set_values (4,5);
 ppoly1->printarea();
 ppoly2->printarea();
 delete ppoly1;
 delete ppoly2;
 return 0;

}


 </source>


Object array: polymorphism.

<source lang="cpp">

  1. include <iostream>
  2. 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; 

}


 </source>


Polymorphism with base class pointer

<source lang="cpp">

  1. include <iostream>
  2. include <stdlib.h>

using namespace std; class Base {

public:
  virtual int add(int a, int b) { return(a + b); };
  virtual int sub(int a, int b) { return(a - b); };
  virtual int mult(int a, int b) { return(a * b); };

}; class ShowMath : public Base {

  virtual int mult(int a, int b) 
   { 
     cout << a * b << endl; 
     return(a * b); };

}; class PositiveSubt : public Base {

  virtual int sub(int a, int b) { return(abs(a - b)); };

}; int main(void)

{
  Base *poly = new ShowMath;
  cout << poly->add(562, 531) << " " << poly->sub(1500, 407) << endl; 
  poly->mult(1093, 1);
  poly = new PositiveSubt;
  cout << poly->add(892, 201) << " " << poly->sub(0, 1093) << endl;
  cout << poly->mult(1, 1093);
}
 
   
 </source>


Use virtual functions and polymorphism.

<source lang="cpp">

  1. include <iostream>
  2. 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; 

}


 </source>