條款7:為多態基類聲明virtual析構函數
阿新 • • 發佈:2017-10-01
pub get 可能 actor bsp class對象 問題 錯誤 需要 1.假設有如下時間類:
class TimeKeeper
{
public:
TimeKeeper();
~TimeKeeper();
};
class AtomicClock :public TimeKeeper {};
factory函數(用戶只是想調用時間,而不想操心時間如何計算等細節):TimeKeeper *getTimeKeeper()
//返回一個base class指針,並指向新生成的derived class
TimeKeeper *a = getTimeKeeper();//動態分配一個對象
delete a;//釋放
這種做法會產生問題,因為getTimeKeeper返回的指針指向一個dervied class對象,而這個對象釋放卻使用了base class中的non-virtual析構函數。產生的後果是:可能對象中dervied class中的成分並未被刪除。造成“局部銷毀的錯誤”。
消除這個錯誤的方法是在base class中定義一個virtual析構函數:virtual ~TimeKeeper()
如果某個類並不是base class,將它的析構函數聲明為virtual並不是一種好的做法。
2.如果class沒有不是基類,那麽就不需要virtual函數,virtual會消耗更多的內存,虛指針和虛表
3.純虛函數最好給pure virtual析構函數提供一份定義
條款7:為多態基類聲明virtual析構函數