虚函数是为了实现一个接口多种处理,把基类中相关的函数设置为虚函数,然后在各个派生类中设置各自的处理方式(即各自与基类的虚函数所相关的函数的执行语句),在其它函数(如主函数)调用时,可以直接用基类的引用或是基类指针指向派生类即可实现动态链编!!!纯虚函数没有函数体,抽象类是用来继承的。
#include<iostream>
using namespace std;
class shape
{
public:
shape(double x)
{r=x;}
virtual void area()=0;
virtual void perimeter()=0;
double GetR(){return r;}
private:
double r;
};
class round :public shape
{
public:
round(double x):shape(x){}
void area()
{
cout<<"圆的面积是:"<<3.14159*shape::GetR()*shape::GetR()<<endl;
}
void perimeter()
{
cout<<"圆的周长是:"<<3.14159*2*shape::GetR()<<endl;
}
};
class nz:public shape
{
public:
nz(double x):shape(x){}
void area()
{
cout<<"圆内接正方形的面积是:"<<(shape::GetR())*(shape::GetR())*2<<endl;
}
void perimeter( )
{
cout<<"圆内接正方形的周长是:"<<shape::GetR()*1.41421*4<<endl;
}
};
class wz:public shape
{
public:
wz(double x):shape(x){}
void area( )
{
cout<<"圆外接正方形的面积是:"<<4*shape::GetR()*shape::GetR()<<endl;
}
void perimeter()
{
cout<<"圆外接正方形的周长是:"<<shape::GetR()*8<<endl;
}
};
void jisuan(shape *xx)
{
xx->area();
xx->perimeter();
}
int main()
{
double d;
cin>>d;
round x(d);
nz y(d);
wz z(d);
jisuan(&x);
jisuan(&y);
jisuan(&z);
return 0;
}