13.13(Shape 类层次结构)实现习题12.7(基于图12.3中的类层次结构)设计的Shape类 层次结构。每个TwoDimensionalShape类都包含成员函数getArea,用于计算二维形状的面积。每个ThreeDimensionalShape类都包含成员函数getArea和 getVolume,分别用于算三维形状的表面积和体积。编写一个程序,使用一个Shape指针的vector对象,它的元素指向类层次中每个具体类的对象。程序应打印输出该vector对象每个元素所指的对象。同样,在处理该vector对象中所有形状的循环中,程序应判断每个形状到底是TwoDimensionalShape 类的还是ThreeDimensionalShape 类的。如果属于TwoDimensionalShape类,就显示其面积,如果属于ThreeDimensionalShape类,就显示其表面积和体积。

时间: 2023-06-24 13:08:20 浏览: 68
以下是实现Shape类层次结构的代码: ```c++ #include <iostream> #include <vector> using namespace std; class Shape { public: virtual void print() const = 0; // 纯虚函数,用于输出形状信息 }; class TwoDimensionalShape : public Shape { public: virtual double getArea() const = 0; // 纯虚函数,用于计算二维形状的面积 }; class ThreeDimensionalShape : public Shape { public: virtual double getArea() const = 0; // 纯虚函数,用于计算三维形状的表面积 virtual double getVolume() const = 0; // 纯虚函数,用于计算三维形状的体积 }; class Circle : public TwoDimensionalShape { private: double radius; public: Circle(double r) : radius(r) {} double getArea() const { return 3.14159 * radius * radius; } void print() const { cout << "Circle with radius " << radius << endl; } }; class Square : public TwoDimensionalShape { private: double side; public: Square(double s) : side(s) {} double getArea() const { return side * side; } void print() const { cout << "Square with side " << side << endl; } }; class Sphere : public ThreeDimensionalShape { private: double radius; public: Sphere(double r) : radius(r) {} double getArea() const { return 4 * 3.14159 * radius * radius; } double getVolume() const { return 4.0 / 3.0 * 3.14159 * radius * radius * radius; } void print() const { cout << "Sphere with radius " << radius << endl; } }; class Cube : public ThreeDimensionalShape { private: double side; public: Cube(double s) : side(s) {} double getArea() const { return 6 * side * side; } double getVolume() const { return side * side * side; } void print() const { cout << "Cube with side " << side << endl; } }; int main() { vector<Shape*> shapes; shapes.push_back(new Circle(2.0)); shapes.push_back(new Square(3.0)); shapes.push_back(new Sphere(2.0)); shapes.push_back(new Cube(3.0)); for (auto s : shapes) { s->print(); if (dynamic_cast<TwoDimensionalShape*>(s)) { cout << "Area: " << dynamic_cast<TwoDimensionalShape*>(s)->getArea() << endl; } else if (dynamic_cast<ThreeDimensionalShape*>(s)) { auto three_d_shape = dynamic_cast<ThreeDimensionalShape*>(s); cout << "Surface Area: " << three_d_shape->getArea() << endl; cout << "Volume: " << three_d_shape->getVolume() << endl; } cout << endl; } for (auto s : shapes) { delete s; } return 0; } ``` 该程序定义了Shape类作为基类,其中有一个纯虚函数print,用于输出形状信息。TwoDimensionalShape和ThreeDimensionalShape分别继承自Shape类,并且都包含一个纯虚函数getArea,用于计算二维形状的面积和三维形状的表面积。ThreeDimensionalShape还包含一个纯虚函数getVolume,用于计算三维形状的体积。程序还定义了四个具体类Circle、Square、Sphere和Cube,分别继承自TwoDimensionalShape和ThreeDimensionalShape,并实现了各自的getArea和getVolume函数。 在main函数中,首先创建一个Shape指针的vector对象shapes,并向其中添加四个具体类的对象。然后,通过一个循环遍历该vector对象中的所有元素,并依次调用每个元素的print函数,打印出该元素所指的对象信息。接着,程序使用dynamic_cast运算符判断每个元素到底是TwoDimensionalShape类的还是ThreeDimensionalShape类的,并分别输出其面积或表面积和体积。最后,程序删除所有动态分配的对象,释放内存。

相关推荐

最新推荐

recommend-type

浙江大学ACM模板(经典代码)

2.6 字典序组合 573、 结构 58 3.1 并查集 58 3.2 堆 59 3.3 线段树 60 3.4 子段和 65 3.5 子阵和 654、 数论 66 4.1 阶乘最后非0位 66 4.2 模线性方程组 67 4.3 素数 68 4.4 欧拉函数 695、 数值计算 70 5.1 定积分...
recommend-type

丽晶MCS营销管理ERP

12.3 零售费用 100 12.4 应付费用单 102 12.5 预付费用 103 12.6 预付费用结转 105 12.7 回款 106 12.8 付款 107 12.9应收款操作 108 12.10 应付款 109 12.11 订金 111 12.11.1 订金收入 111 12.11.2 订金结转 112 ...
recommend-type

Http1.1超文本传输协议中文版

10.5.2 501 不能实现 (Not Implemented) 68 10.5.3 502 坏网关 (Bad Gateway) 68 10.5.4 503 难以获得的服务.(Service Unavailable) 68 10.5.5 504 网关超时(Gateway Timeout) 68 10.5.6 505 HTTP版本不支持...
recommend-type

源代码-ajax即时聊天程序(新手学习推荐).zip

源代码-ajax即时聊天程序(新手学习推荐).zip
recommend-type

python读取excel数据.doc

以下是一个简单的Python代码,用于在控制台上打印一个看起来像爱心的形状。这个代码使用了ASCII字符来创建形状。 python print('\n'.join([''.join([('Love'[(x-y)%4] if ((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 <= 0 else ' ') for x in range(-30, 30)]) for y in range(15, -15, -1)])) 这个代码使用了数学公式来生成心形。但是,由于ASCII字符的限制,这个心形可能看起来不是很完美。 如果你想要一个更详细和定制化的心形,你可能需要使用图形库,如PIL(Python Imaging Library)或matplotlib。但是,这些库通常用于创建图像文件或在图形用户界面上绘制,而不是在控制台上打印。 另外,这里有一个使用turtle模块在图形窗口中绘制爱心的简单示例: python import turtle # 创建一个新的turtle对象 heart = turtle.Turtl
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

云原生架构与soa架构区别?

云原生架构和SOA架构是两种不同的架构模式,主要有以下区别: 1. 设计理念不同: 云原生架构的设计理念是“设计为云”,注重应用程序的可移植性、可伸缩性、弹性和高可用性等特点。而SOA架构的设计理念是“面向服务”,注重实现业务逻辑的解耦和复用,提高系统的灵活性和可维护性。 2. 技术实现不同: 云原生架构的实现技术包括Docker、Kubernetes、Service Mesh等,注重容器化、自动化、微服务等技术。而SOA架构的实现技术包括Web Services、消息队列等,注重服务化、异步通信等技术。 3. 应用场景不同: 云原生架构适用于云计算环境下的应用场景,如容器化部署、微服务
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。