基類指針/引用指向派生類對象,調用虛函數時執行派生類覆蓋版本。編譯期無法確定具體類型,**動態綁定**由運行期機制保證。
class Base { virtual void f1(); virtual void f2(); virtual void f3(); };
class Derived : public Base { virtual void f1(); virtual void f3(); }; // f2 未覆蓋
Base vtable: [ &Base::f1, &Base::f2, &Base::f3 ]
Derived vtable: [ &Derived::f1, &Base::f2, &Derived::f3 ]
Base obj: [ vptr → Base vtable ] [ Base members ]
Derived obj: [ vptr → Derived vtable ] [ Base members ] [ Derived members ]
Base* ptr = new Derived; → ptr->vptr 指向 Derived vtable。ptr->f1(); 編譯生成:ptr->vptr[0]() → 調用 Derived::f1。ptr->f2(); → ptr->vptr[1]() → 調用 Base::f2(未覆蓋)。class NoVirtual { int a,b; void func(); };
class WithVirtual { int a,b; virtual void func(); };
int main() {
cout << sizeof(NoVirtual) << endl; // 8
cout << sizeof(WithVirtual) << endl; // 16 (64位系統,多出 8 字節 vptr)
}
delete basePtr 不會調用派生類析構,導致資源洩漏。final、CRTP、模板靜態多態優化。虛函數表 + 虛表指針是 C++ 實現運行期多態的核心機制:靜態表存函數地址,動態指針綁定對象類型。理解此原理有助於診斷切片問題、優化性能、設計正確的類層次。