编写一个程序,定义抽象基类Shape,由它派生出5个派生类:Circle、Square、Rectangle、Trapezoid、Triangle。用虚函数分别计算几种图形面积,并求它们之和

时间: 2023-07-10 08:32:23 浏览: 23
好的,这是一个面向对象编程的问题,需要使用 C++ 语言来实现。以下是代码实现: ```c++ #include <iostream> using namespace std; // Shape 抽象基类 class Shape { public: virtual double getArea() const = 0; // 纯虚函数,用于计算面积 }; // Circle 类 class Circle : public Shape { private: double radius; // 半径 public: Circle(double r) : radius(r) {} virtual double getArea() const { return 3.14159 * radius * radius; } // 计算圆面积 }; // Square 类 class Square : public Shape { private: double side; // 边长 public: Square(double s) : side(s) {} virtual double getArea() const { return side * side; } // 计算正方形面积 }; // Rectangle 类 class Rectangle : public Shape { private: double length, width; // 长、宽 public: Rectangle(double l, double w) : length(l), width(w) {} virtual double getArea() const { return length * width; } // 计算矩形面积 }; // Trapezoid 类 class Trapezoid : public Shape { private: double upper, lower, height; // 上底、下底、高 public: Trapezoid(double u, double l, double h) : upper(u), lower(l), height(h) {} virtual double getArea() const { return (upper + lower) * height / 2; } // 计算梯形面积 }; // Triangle 类 class Triangle : public Shape { private: double base, height; // 底、高 public: Triangle(double b, double h) : base(b), height(h) {} virtual double getArea() const { return base * height / 2; } // 计算三角形面积 }; int main() { Shape* shapes[5]; // 定义 5 个指向 Shape 类对象的指针数组 shapes[0] = new Circle(2.0); shapes[1] = new Square(3.0); shapes[2] = new Rectangle(2.0, 3.0); shapes[3] = new Trapezoid(2.0, 4.0, 3.0); shapes[4] = new Triangle(2.0, 3.0); double totalArea = 0.0; for (int i = 0; i < 5; i++) { totalArea += shapes[i]->getArea(); // 调用虚函数计算各个图形的面积并求和 } cout << "Total area: " << totalArea << endl; return 0; } ``` 代码解释: 1. 定义了抽象基类 Shape,其中包含一个纯虚函数 getArea(),用于计算面积。 2. 定义了 5 个派生类 Circle、Square、Rectangle、Trapezoid、Triangle,它们分别继承自 Shape 类,并实现了各自的计算面积方法。 3. 在主函数中,定义了一个指向 Shape 类对象的指针数组,用于存储各种图形的实例。 4. 循环遍历指针数组,调用虚函数 getArea() 计算各个图形的面积,并累加到总面积 totalArea 中。 5. 最后输出总面积 totalArea。 注意:这里使用了动态内存分配,需要在程序结束时手动释放内存,即使用 delete 关键字释放指针数组中的各个对象。

最新推荐

微信小程序源码企业展示

微信小程序源码企业展示本资源系百度网盘分享地址

Unity Webgl使用GET/POST获取服务器数据,对JSON数据进行解析

Unity Webgl使用GET/POST获取服务器数据,对JSON数据进行解析

Combination.java

Combination.java

异步通知-MX6U嵌入式linux驱动开发学习笔记基于正点原子阿尔法开发板

异步通知-MX6U嵌入式linux驱动开发学习笔记基于正点原子阿尔法开发板

vue面试题汇总 ,包含答案

vue面试题汇总,包含答案

市建设规划局gis基础地理信息系统可行性研究报告.doc

市建设规划局gis基础地理信息系统可行性研究报告.doc

"REGISTOR:SSD内部非结构化数据处理平台"

REGISTOR:SSD存储裴舒怡,杨静,杨青,罗德岛大学,深圳市大普微电子有限公司。公司本文介绍了一个用于在存储器内部进行规则表达的平台REGISTOR。Registor的主要思想是在存储大型数据集的存储中加速正则表达式(regex)搜索,消除I/O瓶颈问题。在闪存SSD内部设计并增强了一个用于regex搜索的特殊硬件引擎,该引擎在从NAND闪存到主机的数据传输期间动态处理数据为了使regex搜索的速度与现代SSD的内部总线速度相匹配,在Registor硬件中设计了一种深度流水线结构,该结构由文件语义提取器、匹配候选查找器、regex匹配单元(REMU)和结果组织器组成。此外,流水线的每个阶段使得可能使用最大等位性。为了使Registor易于被高级应用程序使用,我们在Linux中开发了一组API和库,允许Registor通过有效地将单独的数据块重组为文件来处理SSD中的文件Registor的工作原

要将Preference控件设置为不可用并变灰java完整代码

以下是将Preference控件设置为不可用并变灰的Java完整代码示例: ```java Preference preference = findPreference("preference_key"); // 获取Preference对象 preference.setEnabled(false); // 设置为不可用 preference.setSelectable(false); // 设置为不可选 preference.setSummary("已禁用"); // 设置摘要信息,提示用户该选项已被禁用 preference.setIcon(R.drawable.disabled_ico

基于改进蚁群算法的离散制造车间物料配送路径优化.pptx

基于改进蚁群算法的离散制造车间物料配送路径优化.pptx

海量3D模型的自适应传输

为了获得的目的图卢兹大学博士学位发布人:图卢兹国立理工学院(图卢兹INP)学科或专业:计算机与电信提交人和支持人:M. 托马斯·福吉奥尼2019年11月29日星期五标题:海量3D模型的自适应传输博士学校:图卢兹数学、计算机科学、电信(MITT)研究单位:图卢兹计算机科学研究所(IRIT)论文主任:M. 文森特·查维拉特M.阿克塞尔·卡里尔报告员:M. GWendal Simon,大西洋IMTSIDONIE CHRISTOPHE女士,国家地理研究所评审团成员:M. MAARTEN WIJNANTS,哈塞尔大学,校长M. AXEL CARLIER,图卢兹INP,成员M. GILLES GESQUIERE,里昂第二大学,成员Géraldine Morin女士,图卢兹INP,成员M. VINCENT CHARVILLAT,图卢兹INP,成员M. Wei Tsang Ooi,新加坡国立大学,研究员基于HTTP的动态自适应3D流媒体2019年11月29日星期五,图卢兹INP授予图卢兹大学博士学位,由ThomasForgione发表并答辩Gilles Gesquière�