1. 为什么需要继承与多态
我刚接触C++时,总觉得继承和多态是那些教科书用来吓唬新手的复杂概念。直到在真实项目中遇到一个图形绘制系统的需求变更,才真正明白它们的价值所在。想象一下,你需要开发一个绘图程序,最初只需要处理圆形和矩形。没有继承时,代码可能是这样的:
cpp复制class Circle {
public:
void draw() { /* 绘制圆形实现 */ }
double area() { /* 计算圆形面积 */ }
};
class Rectangle {
public:
void draw() { /* 绘制矩形实现 */ }
double area() { /* 计算矩形面积 */ }
};
当需求变更要求增加三角形、五边形等十几种图形时,这种写法会导致大量重复代码和维护噩梦。更糟的是,如果要实现一个统一绘制所有图形的函数,你需要这样写:
cpp复制void drawAllShapes() {
for (auto& circle : circles) circle.draw();
for (auto& rect : rectangles) rect.draw();
// 每新增一种图形就要加一行...
}
这就是继承和多态要解决的核心问题——如何优雅地处理一组相关但又有差异的类,以及如何用统一接口操作它们。
2. 继承的本质与实现
2.1 继承的基本语法
C++中使用冒号:表示继承关系。让我们重构上面的图形系统:
cpp复制class Shape {
public:
virtual void draw() = 0; // 纯虚函数
virtual double area() = 0;
virtual ~Shape() {} // 基类析构函数必须为virtual
};
class Circle : public Shape {
double radius;
public:
Circle(double r) : radius(r) {}
void draw() override { /* 实现圆形绘制 */ }
double area() override
