為多态基類聲明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調用的函數是派生類的析構函數。沒問題。