C++ 多態透過虛函式表 與 虛指標 實現遲綁定,在執行期根據物件實際型別決定呼叫哪個函式。
virtual,標記為虛函式override 更安全)
基類 Base { virtual void f(); virtual void g(); }
衍生類 Derived : Base { void f() override; void h(); }
Base vtable: Derived vtable:
+-----------+ +-----------+
| &Base::f | | &Derived::f | ← 重寫:新位址
| &Base::g | | &Base::g | ← 繼承:同位址
+-----------+ | &Derived::h | ← 新增虛函式
+-----------+
Base 物件: Derived 物件:
+------+ +------+
| vptr |──────────► | vptr |──────────► Derived vtable
+------+ +------+
| Base 部分 |
| Derived 部分|
+-------------+
dynamic_cast:需 RTTI 支援,執行期檢查型別安全| 層面 | 影響 | 優化建議 |
|---|---|---|
| 記憶體 | 每物件額外 sizeof(void*) (vptr) | 無虛函式類別不產生 vptr |
| 呼叫開銷 | 間接跳轉 (vptr → vtable → 函式位址) | 關鍵熱點路徑考慮 final/非虛擬化 |
| 編譯期最佳化 | final 類別/函式可去虛擬化 | 善用 final 關鍵字 |