繼承基本概念
繼承是面向對象核心機制,支持層次分類。派生類獲得基類非私有成員,可添加新成員實現「具體化」或「延續化」。
三種繼承方式對比
| 基類成員 | public 繼承 | protected 繼承 | private 繼承 |
| public | public | protected | private |
| protected | protected | protected | private |
| private | 不可見 | 不可見 | 不可見 |
- 公有繼承:is-a 關係,保持接口公開,最常用。
- 保護繼承:基類接口在派生類內部可用,外部不可見。
- 私有繼承:實現細節復用,接口完全隱藏,類似組合。
派生類對基類成員的訪問
- 派生類**成員函數**可訪問基類 `public`/`protected` 成員。
- 派生類**對象**(外部代碼)僅能訪問基類 `public` 成員(且僅在公有繼承下)。
- 基類 `private` 成員在派生類中**不可見**,但佔據內存空間。
多重繼承與作用域解析
若多個基類有同名成員,派生類繼承多份。需用作用域解析符 `基類名::成員名` 區分:
派生類構造與析構順序
- 構造:基類構造(按繼承聲明順序)→ 成員對象構造(按聲明順序)→ 派生類構造函數體。
- 析構:順序完全相反。
- 虛繼承時,虛基類由**最派生類**構造,且只構造一次。
虛函數與多態
- 基類聲明 `virtual`,派生類覆蓋實現動態綁定。
- 純虛函數 `=0` 使類成為抽象類,不可實例化。
- 虛析構函數**必須**聲明為 `virtual`,確保刪除基類指針時正確調用派生類析構函數。
最佳實踐
- 優先使用公有繼承表達 is-a;私有繼承/組合表達 has-a/implemented-in-terms-of。
- 避免深層繼承樹,組合優於繼承。
- 多重繼承謹慎使用,注意菱形繼承需虛繼承解決。
- 基類析構函數永遠聲明 `virtual`。