class Base { public: ~Base() { cout << "Base dtor\n"; } };
class Derived : public Base { public: ~Derived() { cout << "Derived dtor\n"; } };
int main() {
Base* ptr = new Derived();
delete ptr; // 輸出僅 "Base dtor",Derived::~Derived() 未調用!
}
Base*)調用 Base::~Base()。Derived)的析構函數,隨後自動調用基類析構,形成鏈式銷毀。class Base {
public:
virtual ~Base() { cout << "Base dtor\n"; } // 關鍵:virtual
};
class Derived : public Base {
public:
~Derived() override { cout << "Derived dtor\n"; }
};
// delete ptr 現在輸出:
// Derived dtor
// Base dtor
若 Derived 持有資源(new 內存、文件句柄、鎖、socket),其析構函數負責釋放。不調用導致:
valgrind 可檢測)。EMFILE 錯誤)。virtual。virtual ~Base() = 0 {}(C++ 允許純虛函數有函數體)。override 標註派生類析構,防止簽名不匹配。unique_ptr/shared_ptr),自動管理生命周期,從源頭消除手動 delete 錯誤。虛析構函數是 C++ 多態刪除的基石。面試必問、代碼審查必查、生產事故高發區。養成「寫類先寫 virtual ~Class()」的肌肉記憶。