使用多态处理图形示例(P255)
/*
基本内容:
各种图形都有各自的特点,所以定义一个基类CShape表示一般图形,然后派生3个子类分别表示矩形类、圆形类、三角形类。
由于多态的使用,也可以使用相同的代码,分别处理不同的图形,并输出各自的结果。
*/
#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];
}
return 0;
}

浙公网安备 33010602011771号