C++ 通過 虛函數 實現運行時多態。關鍵字 virtual 標記基類函數,派生類可重寫(override)。一旦基類聲明為虛函數,派生類自動視為虛函數(virtual 可省略)。
virtual 虛函數因為基類指針/引用可指向派生類對象(向上轉型),編譯期無法確定對象實際類型,故推遲到運行期根據對象類型綁定正確函數版本。
obj->vptr -> vtable[slot] -> 實際函數地址,實現間接調用。不能。 理由:
不能。 理由:
this 指針,無法獲取對象的 vptr。| 場景 | 基類有 virtual | 基類無 virtual |
|---|---|---|
| 同名、參數不同 | 隱藏(基類虛函數進入派生類虛表,新函數成重載) | 隱藏(非重載,因不同作用域) |
| 同名、參數相同 | 覆蓋(多態) | 隱藏(非覆蓋) |
核心區別:重載是編譯期靜態綁定(同作用域),覆蓋是運行期動態綁定(繼承體系)。
class Base {
virtual void func() = 0; // 純虛函數
};
基類析構函數應聲明為 virtual,確保通過基類指針刪除派生類對象時,先調用派生類析構再調用基類析構,防止資源洩漏。
virtual。override(C++11),編譯器檢查簽名一致性。final 關鍵字可禁止進一步重寫或繼承。