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 |