C++/Class/Polymorphism

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

An example that uses typeid on a polymorphic class hierarchy

 

#include <iostream>
#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;
}


dynamic allocation and polymorphism

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


Object array: 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; 
}


Polymorphism with base class pointer

  
#include <iostream>
#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);
 }


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