C++/Class/Polymorphism
Содержание
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;
}