九大核心特性
- 虛函數可繼承:子類同名同參同返回值函數自動成為虛函數,父類指標指向子類物件時調用子類版本 —— 這就是多態。
- 虛析構函數:防止父類指標刪除子類物件時記憶體洩漏(僅調用父類析構)。
- 虛函數表實作:C++ 多態通過 vtable(虛函數表)實現動態綁定。
- 每類一張表:每個含虛函數的類別有一張靜態虛函數表,所有物件共享。
- 指標可能重合:父子類虛函數表中相同函數指標指向同一代碼地址(子類未覆寫時)。
- 純虛析構也生成表:類別僅含虛析構函數時仍會產生虛函數表。
- 語法核心:多態具體表現為「父類指標/參考指向子類物件,調用子類覆寫方法」。
- 繼承是基礎:無繼承則無多態。
- virtual 關鍵字:建立多態關係的語法核心,必須使用。
記憶體模型示意
物件記憶體佈局:
+----------------+
| vptr (指向 vtable) | ← 每個物件隱含指標
+----------------+
| 資料成員 |
+----------------+
虛函數表 (vtable):
+----------------+
| &Base::func1 |
| &Base::func2 |
| &Derived::func3| ← 覆寫函數指向子類實作
+----------------+
最佳實踐
- 基類析構函數**必須宣告為 virtual**。
- 覆寫虛函數建議加
override (C++11) 防止簽名錯誤。
- 避免在建構子/析構子中呼叫虛函數(行為非預期)。