[CareerCup] 13.6 Virtual Destructor 虛解構函式

Grandyang發表於2015-10-31

 

13.6 Why does a destructor in base class need to be declared virtual?

 

這道題問我們為啥基類中的解構函式要定義為虛擬函式。首先來看下面這段程式碼:

class Foo {
public:
    void f();
};

class Bar: public Foo {
public:
    void f();
};

Foo *p = new Bar();
p->f();

呼叫p->f()會呼叫基類中的f(),這是因為f()不是虛擬函式。為了呼叫派生類中的f(),我們需要在基類中定義其為虛擬函式。

解構函式是用來清除記憶體和資源的,如果基類的解構函式不是虛擬函式,那麼當p是派生類的物件時,也會只呼叫基類的解構函式而無法呼叫派生類的解構函式。這就是我們要定義解構函式為虛擬函式的原因,我們要保證每次都呼叫最新派生類的解構函式。

相關文章