在C++中,將基類的析構函數聲明為虛函數(virtual)具有重要意義。這是因為當我們通過基類指針或引用刪除派生類對象時,虛析構函數可以確保正確地調用派生類的析構函數。如果不使用虛析構函數,只有基類的析構函數會被調用,而派生類的析構函數將被忽略,可能導致資源泄漏和其他問題。
考慮以下情況:
class Base {
public:
~Base() { /* ... */ }
};
class Derived : public Base {
public:
~Derived() { /* ... */ }
};
int main() {
Base* ptr = new Derived();
delete ptr; // 僅調用Base的析構函數,不調用Derived的析構函數
return 0;
}
在這個例子中,ptr
是一個指向Derived
對象的Base
指針。當我們刪除ptr
時,只有Base
類的析構函數會被調用。這可能導致Derived
類中分配的資源沒有得到釋放,從而導致內存泄漏。
為了解決這個問題,我們需要將基類的析構函數聲明為虛函數:
class Base {
public:
virtual ~Base() { /* ... */ }
};
// Derived類保持不變
現在,當我們刪除ptr
時,首先調用Derived
類的析構函數,然后調用Base
類的析構函數。這樣可以確保Derived
類中分配的資源得到正確釋放,避免內存泄漏。