《Effective C++》第六章'继承与面向对象设计'(Inheritance and Object-Oriented Design)是全书最核心、最有深度的章节之一。它主要讨论如何在 C++ 中正确地使用继承,以及继承背后蕴含的面向对象设计原则。
这一章通常包含 Item 32 ~ Item 40(第三版),一共 9 条条款。下面梳理核心思想、关键结论、经典例子和最容易犯的错误。
第六章整体框架
| Item | 核心主题 | 难度 | 重要程度 |
|---|---|---|---|
| 32 | public 继承必须是 is-a 关系 | ★★★ | ★★★★★ |
| 33 | 避免遮掩继承而来的名称 | ★★ | ★★★★ |
| 34 | 区分接口继承与实现继承 | ★★★★ | ★★★★★ |
| 35 | 考虑 virtual 函数的其他替代方案 | ★★★★ | ★★★★ |
| 36 | 绝不重定义继承而来的 non-virtual 函数 | ★★★ | ★★★★ |
| 37 | 绝不重定义继承而来的默认参数值 | ★★ | ★★★ |
| 38 | 通过复合建模 has-a 或 is-implemented-in-terms-of | ★★★ | ★★★★ |
| 39 | 审慎使用 private 继承 | ★★★★ | ★★★★ |
| 40 | 审慎使用多重继承 | ★★★★★ | ★★★★ |
逐条精华提炼
Item 32: 确定你的 public 继承塑模出 is-a 关系
Make sure public inheritance models 'is-a'
- 核心:public 继承意味着 is-a 关系。适用于 base class 的每一件事,也必须适用于 derived class。
- 记住:public 继承是最强的关系承诺。
经典反例:正方形 Square 不是 Rectangle 的子类(尽管数学上看起来是)
class Rectangle {
public:
virtual void setWidth(int w) { width = w; }
virtual void setHeight(int h) { height = h; }
};
: Rectangle {
};

