多态的应用之几何形体处理

输入若干个几何形体的参数,要求按面积从小到大输出,并在输出中指明几何形体类型。

#include <iostream>
#include <cstdlib>
#include <cmath>

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();
};

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);
int MyCompare(const void* s1,const void* s2)
{
    double a1,a2;
    CShape** p1;  //s1,s2是void*,
    CShape** p2;
    p1=(CShape**)s1;  //s1,s2指向pShape数组中的元素,数组元素是CShape*,因此p1,p2是
    p2=(CShape**)s2;  //指向指针的指针,CShape**
    a1=(*p1)->Area();  //*p1的类型是CShape*,是基类的指针,因此是多态
    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;
}
输入样例:

输出样例:


案例来自北京大学网络课堂《C++程序设计》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值