C++虚函数与多态实例
实例来源:C++程序设计(北京大学)
功能描述:输入图形数量和图形的信息,计算出各个图形的面积并排序
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
class CShape
{
public:
virtual double Area()=0; //纯虚函数
virtual void PrintInfo()=0;
};
//矩形
class CRectangle:public CShape
{
public:
int w,h;
virtual double Area();
virtual void PrintInfo();
};
double CRectangle::Area()
{
return w*h;
}
void CRectangle::PrintInfo()
{
cout<< "Rectangle: "<<Area()<<endl;
}
//圆形
class CCircle:public CShape
{
public:
int r;
virtual double Area();
virtual void PrintInfo();
};
double CCircle::Area()
{
return 3.14*r*r;
}
void CCircle::PrintInfo()
{
cout<< "Circle: "<<Area()<<endl;
}
//三角形
class CTriangle:public CShape
{
public:
int a,b,c;
virtual double Area();
virtual void PrintInfo();
};
double CTriangle::Area()
{
double p = (a+b+c)/2.0;
return sqrt(p*(p-a)*(p-b)*(p-c));
}
void CTriangle::PrintInfo()
{
cout<< "Triangle: "<<Area()<<endl;
}
CShape *pShapes[100];
int MyCompare(const void *s1,const void *s2);
int main()
{
int i;
int n;
CRectangle *pr;
CCircle *pc;
CTriangle *pt;
cin>>n;
for(i=0; i<n; i++)
{
char c;
cin>>c;
switch(c)
{
case 'R':
pr = new CRectangle();
cin>>pr->w>>pr->h;
pShapes[i] = pr;
break;
case 'C':
pc = new CCircle();
cin>>pc->r;
pShapes[i] = pc;
break;
case 'T':
pt = new CTriangle();
cin>> pt->a>> pt->b>> pt->c;
pShapes[i] = pt;
break;
}
}
qsort(pShapes,n,sizeof(CShape*),MyCompare);
for(i=0; i<n; i++)
pShapes[i]->PrintInfo();
return 0;
}
int MyCompare(const void *s1,const void *s2)
{
double a1,a2;
CShape **p1; //s1和s2是void*,所以需要指向指针的指针
CShape **p2; //这里定义的是CShape*指针
p1 = (CShape**)s1; //强制类型转换
p2 = (CShape**)s2;
a1 = (*p1)->Area(); //*p1的类型是CShape*,是基类指针,故此句为多态
a2 = (*p2)->Area();
if(a1<a2)
return -1;
else if(a2<a1)
return 1;
else
return 0;
}