Menu
CoddyTech

回顾:形状计算器

本课属于 Coddy C++ 学习旅程的“面向对象编程”单元。第 63 课,共 104 课。

challenge icon

挑战

简单

让我们构建一个形状计算器,把你学到的多态知识融会贯通。你将创建一个抽象的 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:读取四个输入(每个输入单独占一行):
    1. 圆的半径(double)
    2. 矩形的宽度(double)
    3. 矩形的高度(double)
    4. 第二个圆的半径(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++ 在线编译器