1. 程式人生 > >基類解構函式為virtual的好處

基類解構函式為virtual的好處

class Base
{
public:
    ~Base(){...}
    ... 
};
class Child:public Base
{
public:
    ~Child(){...}
};
int main()
{
    Child c;
    ...
    return 0;
}

上面程式碼執行時,在生成Child物件c時,實際上先呼叫基類Base的建構函式,然後再呼叫Child類的建構函式。當撤銷c時,先呼叫Child的解構函式,然後在呼叫Base的解構函式,也就是說,無論基類的解構函式是否為虛構函式,肯定會依次呼叫其基類的解構函式。根本原因:上面所有物件都存在於棧中,當其離開作用域時,該物件會被自動撤銷。
然而為什麼還要搞個虛構函式呢?
這是因為多型的存在。

Base *pBase;
Child c;
pBase =& c;

那麼,當pBase被撤銷時呢?如果Base的解構函式不是virtual,那麼根據靜態聯編,顯然會呼叫Base的解構函式,而不會呼叫Child類的解構函式。而如果Base的解構函式改為virtual,當pBase指標被撤銷時,就會先呼叫Child類解構函式,再呼叫Base類的解構函式。根本原因:上面過程是動態聯編,在堆中進行,如果不將基類解構函式設定為virtual,則會造成記憶體洩露。基類解構函式設定為virtual後,所有派生類的解構函式都將會是virtual。