多態:面向對象三大支柱之一
與封裝、繼承並列,多態指同一消息(函數調用)被不同對象接收時產生不同行為。
1. 靜態聯編 vs 動態聯編
- 靜態聯編(編譯期):函數重載、模板實例化、普通函數調用。調用關係編譯期固定。
- 動態聯編(運行期):通過虛函數實現,根據對象實際類型決定調用哪個覆寫版本。
2. 多態分類
- 編譯時多態(靜態):函數重載、運算符重載、模板。
- 運行時多態(動態):虛函數 + 基類指針/引用指向派生對象。
3. 虛函數
聲明
class Base {
virtual 返回類型 FuncName(參數列表);
};
- 派生類中同名同參函數自動成為虛函數(建議加
override)。
- 構造函數、靜態成員函數、全局函數不能為虛函數。
- 析構函數應聲明為虛函數,確保正確析構派生對象。
動態聯編條件
- 基類指針/引用指向派生對象。
- 調用的是虛函數。
4. 基類指針指向派生對象
基類指針僅能訪問派生對象中的基類部分,但調用虛函數時觸發動態聯編。
5. 純虛函數與抽象類
純虛函數
virtual 返回類型 FuncName(參數列表) = 0;
抽象類
- 包含至少一個純虛函數的類。
- 只能作基類,不能實例化對象。
- 作為接口規範,具體實現延遲到派生類。
相關文章