virtual 關鍵字聲明,實現**運行時多態**。virtual 或 C++11 override)。using Base::func)。Base*,派生類可返回 Derived*。class Base { public: virtual ~Base() { cout << "Base dtor\n"; } };
class Derived : public Base {
int* p;
public:
Derived() { p = new int; }
~Derived() { delete p; cout << "Derived dtor\n"; }
};
int main() {
Base* ptr = new Derived();
delete ptr; // 虛析構確保先調用 ~Derived() 再 ~Base(),避免記憶體洩漏
}
無 virtual 時,delete ptr 僅調用 ~Base(),派生類資源洩漏。
示例結構:
Base vtable: [ &Base::f, &Base::g ] Derived vtable: [ &Derived::f, &Base::g, &Derived::h ] Derived object: [ vptr → Derived vtable, Base::i, Derived::j ]
ptr->vfunc() → 取 ptr->vptr → 索引虛表槽位 → 跳轉執行。virtual inline 實際不內聯。virtual void f() = 0; 定義抽象類,強制派生類實現。虛函數是 C++ 多態的基石,虛表/虛指針機制以極小空間換取運行時靈活性。牢記:基類析構**必須**虛化,構造/析構中避免虛調用,善用 override/final 讓編譯器守護正確性。