//设计一个计算图形面积的类库。
//类库的顶层是一个抽象类Shape,并且提供三个纯虚函数;显示数据成员、返回面积和返回体积。
//由Shape类派生Shape2D(二维图形)和Shape3D(三维图形),增加了有关的数据成员
//派生具体的图形类。
//派生Circle(圆)、Rectangle(矩形)。
//在主函数测试中使用多态方式调用不同对象的求值函数。

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
const double PI = 3.1415926;

//创建一个抽象类
class Shape
{
public:
    virtual ~Shape(){}              //虚析构
    virtual double GetArea() = 0;   //返回面积
    virtual double GetPerim() = 0;  //返回周长
};

// 圆形
class Circle :public Shape
{
public:
    double mRadius;  //半径
    Circle(double r) // 构造函数
        :mRadius(r){
        cout << "ctor Circle" << endl;
    }
    ~Circle()
    {
        cout << "dtor Circle" << endl;
    }

    // 计算面积
    double GetArea()
    {
        return PI * mRadius * mRadius;
    }
    // 计算周长
    double GetPerim()
    {
        return 2 * PI * mRadius;
    }
};

// 方形
class Rectangle :public Shape
{
public:
    double mWide, mTall;// 长宽
    Rectangle(double w, double h)// 构造函数
        :mWide(w), mTall(h) {
        cout << "ctor Rectangle" << endl;
    }
    ~Rectangle()
    {
        cout << "dtor Rectangle" << endl;
    }

    // 计算面积
    double GetArea()
    {
        return mWide * mTall;
    }
    // 计算周长
    double GetPerim()
    {
        return 2 * (mWide + mTall);
    }
};

// 多态方法调用
void fun(Shape *s)
{
    cout << "面积:" << s->GetArea()
        << "周长:" << s->GetPerim()
        << endl;
}

int main(void)
{
    Circle      t1(1.0);
    Rectangle   t3(2.0, 3);

    fun(&t1);
    fun(&t3);
    // 暂停
    system("pause");
    return EXIT_SUCCESS;
}