1. 程式人生 > >條款7:為多態基類聲明virtual析構函數

條款7:為多態基類聲明virtual析構函數

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析構函數