1. 公有继承(public
)
什么时候用?
- “是一个”(is-a)关系:派生类 是 基类的一种。
- 例:
class Dog : public Animal
(狗是动物)
- 例:
- 最常见,90%的继承都用它。
2. 保护继承(protected
)
什么时候用?
- “实现继承”:只希望派生类能访问基类成员,外部不能访问。
- 例:工具类继承,基类方法仅供派生类内部使用。
3. 私有继承(private
)
什么时候用?
- “用…实现”(has-a 的替代方案):
- 派生类 内部使用 基类功能,但 不暴露接口。
- 例:
class Stack : private LinkedList
(栈用链表实现,但对外不暴露链表方法)。
4. 多重继承
什么时候用?
- 组合多个功能:一个类需要 同时具备多个基类特性。
- 例:
class Smartphone : public Phone, public Camera
(智能手机既是电话又是相机)。
- 例:
- ⚠️ 注意:避免基类有同名成员(会冲突)。
5. 虚拟继承(virtual
)
什么时候用?
- 解决"钻石继承"问题(一个基类被多次继承)。
- 例:
class A {}; class B : virtual public A {}; // 虚拟继承 class C : virtual public A {}; class D : public B, public C {}; // 不会重复继承A
- 例:
6. 纯虚函数 & 抽象类
什么时候用?
- 强制派生类实现接口:
- 例:
class Shape { public:virtual void draw() = 0; // 纯虚函数 }; class Circle : public Shape { public:void draw() override { /* 必须实现 */ } };
- 例:
- 抽象类不能实例化,只能被继承。
总结:什么时候用什么?
继承方式 | 典型场景 | 示例 |
---|---|---|
public | "是一个"关系(is-a) | Dog : public Animal |
protected | 仅派生类可访问基类成员 | 工具类内部继承 |
private | “用…实现”(不暴露基类接口) | Stack : private LinkedList |
多重继承 | 组合多个功能 | Smartphone : Phone, Camera |
虚拟继承 | 解决钻石继承问题 | D : B, C (B/C虚拟继承A) |
纯虚函数 | 强制派生类实现接口 | Shape → Circle |