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

xiaoxiao2021-02-28  98

#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; }
转载请注明原文地址: https://www.6miu.com/read-52528.html

最新回复(0)