. 设计一个图形类继承体系。具体要求如下: - 设计一个抽象基类 `Shape`, `Shape`类中应包含: - 纯虚函数 `double getArea() const = 0`(计算面积) - 纯虚函数 `double getPerimeter() const = 0`(计算周长) - 虚析构函数 - 虚函数 `void display() const`(打印图形的关键参数,例如圆形的半径或矩形的长宽) - 从 `Shape` 派生出以下两个具体的图形类: - `Circle`(圆形):需要存储半径 - `Rectangle`(矩形):需要存储长和宽 每个派生类都应:有合适的构造函数初始化其数据成员,实现所有纯虚函数和虚函数,使用 `override` 关键字明确标识覆盖的函数。并在main函数中创建不同图形对象并结合类型兼容规则,展示多态性。
时间: 2025-06-05 22:40:33 浏览: 18
### 设计一个C++图形类继承体系
以下是一个完整的 `Shape` 抽象基类及其派生类 `Circle` 和 `Rectangle` 的实现方案,其中包括纯虚函数 `getArea` 和 `getPerimeter`,以及虚函数 `display`。此设计充分体现了多态性的应用。
#### 完整代码示例
```cpp
#include <iostream>
#include <cmath> // 用于圆周率计算
using namespace std;
// 抽象基类 Shape
class Shape {
protected:
string name; // 图形名称
public:
Shape(string n = "") : name(n) {} // 构造函数初始化图形名
// 纯虚函数:获取面积
virtual double getArea() const = 0;
// 纯虚函数:获取周长
virtual double getPerimeter() const = 0;
// 虚函数:显示图形信息,默认实现为空
virtual void display() const { cout << "This is a shape named: " << name << endl; }
// 虚析构函数确保安全释放资源
virtual ~Shape() {}
};
// 圆形 Circle 继承自 Shape
class Circle : public Shape {
private:
double radius; // 半径
public:
Circle(double r, string n = "Circle") : Shape(n), radius(r) {}
// 实现纯虚函数 getArea
double getArea() const override {
return M_PI * pow(radius, 2); // 面积公式 πr^2
}
// 实现纯虚函数 getPerimeter
double getPerimeter() const override {
return 2 * M_PI * radius; // 周长公式 2πr
}
// 显示圆形具体信息
void display() const override {
cout << "Circle with radius " << radius << ": "
<< "Area=" << getArea() << ", Perimeter=" << getPerimeter() << endl;
}
};
// 矩形 Rectangle 继承自 Shape
class Rectangle : public Shape {
private:
double width, height; // 宽度和高度
public:
Rectangle(double w, double h, string n = "Rectangle") : Shape(n), width(w), height(h) {}
// 实现纯虚函数 getArea
double getArea() const override {
return width * height; // 面积公式 wh
}
// 实现纯虚函数 getPerimeter
double getPerimeter() const override {
return 2 * (width + height); // 周长公式 2(w+h)
}
// 显示矩形具体信息
void display() const override {
cout << "Rectangle with dimensions (" << width << "," << height << "): "
<< "Area=" << getArea() << ", Perimeter=" << getPerimeter() << endl;
}
};
// 主函数测试多态性
int main() {
// 创建形状指针数组存储不同子类对象
Shape* shapes[] = {
new Circle(5),
new Rectangle(4, 6)
};
// 展示多态特性
for(auto shape : shapes){
shape->display(); // 动态绑定到实际子类的方法
}
// 清理动态分配内存
for(auto shape : shapes){
delete shape;
}
return 0;
}
```
#### 关键点解析
- **抽象基类 `Shape`**
定义了一个通用接口,包含两个必需的纯虚函数 `getArea` 和 `getPerimeter`,任何具体的几何形状都必须提供这些功能的具体实现[^1]。此外还定义了一个默认实现的虚函数 `display`,以便某些情况下可以有统一的行为模式。
- **派生类 `Circle` 和 `Rectangle`**
每个派生类都需要覆盖来自父类的所有纯虚函数,并可以选择性地重新定义其他虚函数。这样做的目的是为了满足特定类型的实际需求[^2]。
- **多态的应用**
在主函数中使用指向基类的指针或引用管理不同的派生类实例,运行时会自动调用对应派生类版本的方法,这就是所谓的动态分派或多态机制[^3]。
---
####
阅读全文
相关推荐











