C++/Class/Polymorphism — различия между версиями
Admin (обсуждение | вклад) м (1 версия: Импорт контента...) |
|
(нет различий)
|
Версия 17:21, 25 мая 2010
Содержание
An example that uses typeid on a polymorphic class hierarchy
<source lang="cpp">
- 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;
}
</source>
dynamic allocation and polymorphism
<source lang="cpp">
- 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">
- 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;
}
</source>
Polymorphism with base class pointer
<source lang="cpp">
- 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); } </source>
Use virtual functions and polymorphism.
<source lang="cpp">
- 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;
}
</source>