定义一个shape抽象类,在此基础上派生出矩形rectangle和圆形circle类,
二者都有getPerim函数计算对象的周长。
getPerim函数是纯虚函数,getName是虚函数。
如果不设置getName为虚函数那么在进行指针调用这个函数的时候就不能调用派生类的相应函数了。
结果即为如图:
正确运行结果为:
#include<iostream>
using namespace std;
#define PI 3.14159
class shape{
public:
virtual float getPerim() const =0;
virtual void getName()const{cout<<"shape:";}
shape(){}
~shape(){}
};
class Rectangle:public shape{
public:
Rectangle(){}
~Rectangle(){}
Rectangle(float l,float w):length(l),width(w){}
virtual float getPerim() const;
virtual void getName()const{cout<<"Rectangle:";}
private:
float length,width;
};
float Rectangle::getPerim() const{
return 2*(length+width);
}
class Circle :public shape{
public:
Circle(){}
Circle(float r):radius(r){}
~Circle(){}
virtual float getPerim()const;
virtual void getName()const{cout<<"Circle:";}
private:
float radius;
};
float Circle::getPerim()const{
return 2*PI*radius;
}
void main(){
shape *sp;
Circle circle(2.2);
Rectangle rectangle(1.5,6.6);
/*普通的访问方式,另一种是使用指针实现动态多态
circle.getName();
cout<<circle.getPerim()<<endl;
rectangle.getName();
cout<<rectangle.getPerim()<<endl;
*/
sp=&circle;
sp->getName();
cout<<sp->getPerim()<<endl;
sp=&rectangle;
sp->getName();
cout<<sp->getPerim()<<endl;
}