天天看點

Effective C++條款7

為多态基類聲明virtual析構函數

本節重點大家隻要明白為什麼要聲明析構函數為virtual函數,即聲明virtual析構函數的意義。

我們知道,析構函數的作用就是實作多态polymorphic。那麼如果我們動态建立一個derived派生類,由基類指針接受該派生類位址。那麼我們如何釋放這個派生類的記憶體?

如下代碼:

class A
{
//...........
};

class B:public A
{
//.................
};

A* a=new B;
delete a;
           

大家認為以上釋放有沒有問題?

其實可能有問題也可能沒問題,當基類的析構函數是virtual類型的就沒問題,當基類的析構函數不是virtual則有問題。

試想一下,當基類的析構函數不是virtual,那麼delete a調用的函數是基類的析構函數,它不會釋放派生類的部分,造成記憶體的洩露。

當基類的析構函數是virtual,那麼delete a調用的函數是派生類的析構函數。沒問題。

繼續閱讀