回顾:形状计算器
本课属于 Coddy C++ 学习旅程的“面向对象编程”单元。第 63 课,共 104 课。
挑战
简单让我们构建一个形状计算器,把你学到的多态知识融会贯通。你将创建一个抽象的 Shape 类,并实现可以计算面积和周长的具体形状类,所有形状都可以通过一个通用接口访问。
你将把代码分成四个文件:
Shape.h:定义一个抽象Shape类,作为所有形状的蓝图。基类应包含:- 一个受保护的
std::string name成员,用于标识形状 - 一个用于初始化名称的构造函数
- 返回
double的纯虚方法area()和perimeter() - 一个返回形状名称的
getName()方法 - 一个虚析构函数
- 一个受保护的
Circle.h:实现一个继承自Shape的Circle类:- 一个私有的
double radius成员 - 一个接收半径的构造函数(将名称设为
"Circle") - 使用公式 3.14159 * radius * radius 实现
area() - 使用公式 2 * 3.14159 * radius 实现
perimeter()
- 一个私有的
Rectangle.h:实现一个继承自Shape的Rectangle类:- 私有的
double width和double height成员 - 一个接收宽度和高度的构造函数(将名称设为
"Rectangle") - 将
area()实现为 width * height - 将
perimeter()实现为 2 * (width + height)
- 私有的
main.cpp:读取四个输入(每个输入单独占一行):- 圆的半径(double)
- 矩形的宽度(double)
- 矩形的高度(double)
- 第二个圆的半径(double)
动态创建这三个形状,并将它们存储在一个由
Shape*指针组成的数组中。遍历数组,对每个形状按以下格式打印信息:<name>: Area: <area> Perimeter: <perimeter>在每个形状的信息之间打印一个空行。完成后,清理动态分配的对象。
例如,输入 5、4、6 和 3 时:
Circle:
Area: 78.5397
Perimeter: 31.4159
Rectangle:
Area: 24
Perimeter: 20
Circle:
Area: 28.2743
Perimeter: 18.8495注意,同一套 printShapeInfo 逻辑适用于任何形状类型。这就是多态的优势。你的代码通过 Shape 接口,以相同的方式处理圆形和矩形,并且每种形状都知道如何计算自己的测量值。对所有重写的方法使用 override 关键字,以确保函数签名正确。
亲手试试
#include <iostream>
#include "Shape.h"
#include "Circle.h"
#include "Rectangle.h"
using namespace std;
int main() {
// 读取输入
double circleRadius1, rectWidth, rectHeight, circleRadius2;
cin >> circleRadius1;
cin >> rectWidth;
cin >> rectHeight;
cin >> circleRadius2;
// TODO: 创建一个包含 3 个 Shape* 指针的数组
// Shape* shapes[3];
// TODO: 动态创建形状并存入数组
// shapes[0] = new Circle(...);
// shapes[1] = new Rectangle(...);
// shapes[2] = new Circle(...);
// TODO: 遍历数组并打印每个形状的信息
// 格式:
// <name>:
// 面积:<area>
// 周长:<perimeter>
// (形状之间空一行,最后一个形状后不留空行)
// TODO: 清理动态分配的对象
// delete shapes[i];
return 0;
}
面向对象编程中的所有课
自己练习: C++ 在线编译器