基類指針指向派生類對象,delete 時若基類析構函數非虛函數,只調用基類析構,派生類析構不被調用,導致派生類資源洩露。
class Base { public: ~Base() { cout << "Base destructor\n"; } };
class Derived : public Base { public: ~Derived() { cout << "Derived destructor\n"; } };
int main() { Base* p = new Derived(); delete p; }
// 輸出:Base destructor (Derived destructor 缺失)
class Base { public: virtual ~Base() { cout << "Base destructor\n"; } };
// 輸出:Derived destructor -> Base destructor (正確調用鏈)
final 禁止繼承,則無需虛析構。虛析構使對象包含 vptr,delete 通過 vptr 查找正確析構函數入口。非虛析構則靜態綁定到基類析構。