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是派生類的物件時,也會只呼叫基類的解構函式而無法呼叫派生類的解構函式。這就是我們要定義解構函式為虛擬函式的原因,我們要保證每次都呼叫最新派生類的解構函式。