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

C++虚函数与多态实例