本文主要是介绍064day(多态实例:几何形体程序),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
172210704111-陈国佳总结《2017年12月13日》【连续064天】
标题:多态实例:几何形体程序;
内容:
A.几何形体处理程序:
输入若干个几何形体参数,按面积排序输出;
Input:
第一行是几何形体数目n,下有n行,每行以一个字母c开头。若c是‘R’,则是矩形,后跟2个整数(长宽);
若c是‘C’,代表圆,后跟一个数;若c是‘T’,则代表一个三角形,后跟三个整数,代表三边;
Output:
按面积从小到大输出每个几何形体的种类和面积。格式: 形体名称:面积
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();
};
class CCircle:public CShape{
public:
int r;
virtual double Area();
virtual void PrintInfo();
};
class CTriangle:public CShape{
public:
int a,b,c;
virtual double Area();
virtual void PrintInfo();
};
double CRectangle::Area(){
return w*h;
}
void CRectangle::PrintInfo(){
cout<<"Rectangle:"<<Area()<<endl;
}
double CCircle::Area(){
return 3.14*r*r;
}
void CCircle::PrintInfo(){
cout<<"Circle:"<<Area()<<endl;
}
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){
double a1,a2;
CShape**p1;
CShape**p2;
p1=(CShape**)s1; //多态
p2=(CShape**)s2;
a1=(*p1)->Area();
a2=(*p2)->Area();
if(a1<a2)return -1;
else if(a2<a1)return 1;
else return 0;
}
int main()
{
int i,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;
}
使用多态可以便于扩充程序:
例如上题,加入一个新的几何形体,比如五边形,只需多写一个CShape的派生类,并在main中的switch语句中加入一个case;
注意:用基类指针数组存放指向各种派生类对象的指针,然后遍历该数组,就可对各个派生类对象进行各种操作;
B.
class Base{
public:
void fun1(){fun2();}
virtual void fun2(){cout<<"Base::fun2()"<<endl;}
};
class Derived:public Base{
public:
virtual void fun2(){cout<<"Derived:fun2()"<<endl;}
};
int main(){
Derived d;
Base*pBase=&d;
pBase->fun1();
return 0;
}
上式中的fun1可写成 void fun1(){this->fun2();} //this是基类指针,fun2是虚函数,多态
在非构造,析构函数的成员函数中调用虚函数,是多态!
明日计划:继续学习分治;
这篇关于064day(多态实例:几何形体程序)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!