爲何需要虛析構函數

//首先,我們定義了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的析構函數。
     因此,使用虛析構函數可以確保正確的析構函數被調用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章