继承,虚函数应用,对象向量

#include <iostream>
#include <iomanip>
#include <string>
#include <cmath>
#include <vector>
#define PI 3.1416
using namespace std;

class Shape//定义抽象基类
{
public:
    Shape() {}//构造函数
    virtual double GetArea() const =0;//纯虚函数
    virtual ~Shape() {}//虚析构函数

};

double TotalArea(const vector<Shape *> & p)//求面积和
{
    double total=0;
    for(int i=0;i<p.size();i++)
        total+=p[i]->GetArea();
    return total;
}

class Circle : public Shape//圆继承基类shape
{
private:
    double radius;//半径
public:
    Circle(double r) : radius(r) {}//构造函数,初始化半径
    virtual double GetArea() const//返回圆的面积
    {
        return radius * radius * PI;
    }
};

class Rectangle : public Shape//长方形继承基类shape
{
private:
    double height;//定义长
    double width;//定义宽
public:
    Rectangle(double h, double w) : height(h), width(w) {}//构造函数,初始化长和宽
    virtual double GetArea() const//返回长方形的面积
    {
        return height * width;
    }
};

class Triangle : public Shape//三角形继承基类shape
{
private:
    double a, b, c;//定义边长
    double p;//海伦公式
public:
    Triangle(double A, double B, double C) : a(A), b(B), c(C)//构造函数,初始化边长
    {
        p = (a + b + c) / 2;
    }

    virtual double GetArea() const//返回三角形的面积
    {
        return sqrt(p * (p - a) * (p - b) * (p - c));
    }
};



int main()
{
    string order;//预处理命令
    vector<Shape * > p;//抽象基类指针
    double radius, height, width, a, b, c;//定义基本变量
    while (cin >> order) {
        char Ord;//实际命令
        if (order == "circle")
            Ord = 'c';
        if (order == "rectangle")
            Ord = 'r';
        if (order == "triangle")
            Ord = 't';
        switch (Ord) {
            case 'c':
                cin >> radius;
                p.push_back(new Circle(radius));
                break;
            case 'r':
                cin >> height >> width;
                p.push_back(new Rectangle(height, width));
                break;
            case 't':
                cin >> a >> b >> c;
                p.push_back(new Triangle(a, b, c));
                break;
            default:
                break;
        }
    }
    cout.precision(4);
    cout << fixed << TotalArea(p) << endl;
    for(int i=0;i<p.size();i++)
        delete p[i];
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值