自考新教材-p255
使用多态处理图形示例
源程序:
#include <iostream>
#include <cmath>
using namespace std;
class CShape
{
protected:
double acreage;
public:
CShape()
{
//cout<<"基类构造函数"<<endl;
};
virtual ~CShape()
{
//cout<<"基类析构函数"<<endl;
}
virtual double CalAcr()
{
return 0;
};
virtual void setAcreage(double acre){};
virtual void PrintInfo(){};
};
class CRectangle:public CShape
{
double width,high;
public:
CRectangle(double w,double h)
{
//cout<<"矩形带参构造函数"<<endl;
width = w;
high = h;
};
CRectangle()
{
//cout<<"矩形无参构造函数"<<endl;
width = 0;
high = 0;
};
~CRectangle()
{
//cout<<"矩形析构函数"<<endl;
}
virtual double CalAcr();
virtual void PrintInfo();
virtual void setAcreage(double);
};
class CCircle:public CShape
{
double radius;
public:
CCircle(double r)
{
//cout<<"圆形带参构造函数"<<endl;
radius = r;
};
CCircle()
{
//cout<<"圆形无参构造函数"<<endl;
radius = 0;
};
~CCircle()
{
//cout<<"圆形析构函数"<<endl;
}
virtual double CalAcr();
virtual void PrintInfo();
virtual void setAcreage(double);
};
class CTriangle:public CShape
{
double a,b,c;
public:
CTriangle(double a,double b,double c)
{
//cout<<"三角形带参构造函数"<<endl;
this->a=a;
this->b=b;
this->c=c;
};
CTriangle()
{
//cout<<"三角形无参构造函数"<<endl;
a=0;
b=0;
c=0;
};
~CTriangle()
{
//cout<<"三角形析构函数"<<endl;
};
virtual double CalAcr();
virtual void PrintInfo();
virtual void setAcreage(double);
};
double CRectangle::CalAcr()
{
return width*high;
}
void CRectangle::PrintInfo()
{
cout<<"矩形.\t 宽度="<<this->width<<",高度 ="<<this->high<<", 面积"<<this->acreage<<endl;
}
void CRectangle::setAcreage(double acre)
{
acreage = acre;
}
double CCircle::CalAcr()
{
return 3.14*radius*radius;
}
void CCircle::PrintInfo()
{
cout<<"圆.\t 半径="<<this->radius<<",面积"<<this->acreage<<endl;
}
void CCircle::setAcreage(double acre)
{
acreage = acre;
}
double CTriangle::CalAcr()
{
double p = (a+b+c)/2.0;
return sqrt(p*(p-a)*(p-b)*(p-c));
}
void CTriangle::PrintInfo()
{
cout<<"三角形.三条边分别是: "<<this->a<<","<<this->b<<","<<this->c<<",面积="<<this->acreage<<endl;
}
void CTriangle::setAcreage(double acre)
{
acreage = acre;
}
CShape * pShapes[100];
int main()
{
int i,n;
double temp1,temp2,temp3;
CRectangle *pr;CCircle *pc;CTriangle *pt;
cin>>n;
for(i=0;i<n;++i)
{
char c;
cin>>c;
switch(c)
{
case'R':case'r':
cin>>temp1>>temp2;
pr=new CRectangle(temp1,temp2);
pr->setAcreage(pr->CalAcr());
pShapes[i]=pr;
break;
case'C':case'c':
cin>>temp1;
pc=new CCircle(temp1);
pc->setAcreage(pc->CalAcr());
pShapes[i]=pc;
break;
case'T':case't':
cin>>temp1>>temp2>>temp3;
pt=new CTriangle(temp1,temp2,temp3);
pt->setAcreage(pt->CalAcr());
pShapes[i]=pt;
break;
}
}
if(n==1)
cout<<"共有 "<<n<<"种图形,它是"<<endl;
else
cout<<"共有 "<<n<<"种图形,分别是"<<endl;
for(i=0;i<n;++i)
{
//cout<<"1"<<endl;
pShapes[i]->PrintInfo();
delete pShapes[i];
}
system("pause");
return 0;
}
运行结果: