//首先,我們定義了A類
class A
{
public:
~A()
{
cout << "~A()" << endl;
}
private:
char * a;
};
//然後定義B類,B類繼承自A類
class B : public A
{
public:
~B()
{
cout << "~B()" << endl;
}
private:
char * b;
};
我們在main函數中定義
int main()
{
A * p = new B();
delete p;
return 0;
}
執行
結果是隻是調用了類A的析構函數,類B的未調用,如圖
接下來,我們將基類中的析構函數聲明成虛函數,派生類就不用再聲明瞭,他在派生類中將自動成爲虛方法。然而,在派生類中使用關鍵字virtual來指出哪些函數是虛函數也不失爲一個好方法。
class A
{
public:
virtual ~A()
{
cout << "~A()" << endl;
}
private:
char * a;
};
我們再次執行main方法,結果可想而知了。
總結:
我們爲什麼應該把析構函數定義爲虛函數。如果析構函數不是虛的,則將只調用指針類型的析構函數。對於第一次運行程序時,以爲着只有A的析構函數被調用,即使指針指向了的時B對象,如果析構函數定義爲虛的,將調用相應對象類型的析構函數。因此,如果指針指向的時B對象,將調用B的析構函數,然後自動調用基類A的析構函數。
因此,使用虛析構函數可以確保正確的析構函數被調用。