為多態基類聲明virtual析構函數
為多態基類聲明virtual 析構函數
一 首先看下面的代碼
#inclue <isotream>
using namespace std ;

class TimeKeeper
{ //基類
public :
TimeKeeper() ;
~TimeKeeper() ;
} ;
class AtomicClck : public TimeKeeper //原子鐘 
{
} ;
class WaterClck : public TimeKeeper //水鐘 
{
} ; 
class WristClck : public TimeKeeper //腕表 
{
} ; 
int main()
{
TimeKeeper * ptk = getTimeKeeper() ; //工廠方法獲取鐘的對象
delete ptk ; //由于父類中的析構函數聲明為非virtual,所以只會執行父類的析構函數
//這樣就會造成子類中特有成員內存泄露
}
由于TimeKeeper的析構函數沒有設置成為virtual,造成子類進行delete操作的時候,內存可能會發生泄漏,因為delete只會執行基類的析構函數。
virtual 函數的作用是,允許子類對基類的操作進行客制化,所以如果父類中存在一個成員函數是virtual,那么可以肯定的是,需要設置父類的virtual 析構函數。
二 virtual 多余添加
當一個class 中不含有virtual函數,則表明它不打算作為基類使用,這時候如果令其析構函數為virtual,則會造成不必要的麻煩。考慮下面的簡單類實例
class Point
{
public :
Point(int x, int y) ;
~Point() ;
private :
int x , y ;
} ;
該類只含有兩個整形變量,所以它的大小是64bits,但是如果將析構函數變為virtual,則結果是96bits。
原因是,為了在運行期動態地執行函數,對象就需要存儲某些信息,需要給出一個虛函數指針。
vptr指向一個函數指針數組,每一個class都有一個函數指針數組。當對象調用一個virtual時,實際被調用的
函數取決于該對象的vptr指向的那個vtbl,編譯器在其中尋找適當的函數指針。
所以如果一個對象中含有virtual函數,則對象的體積就會變大。
三 純虛函數
有時候可以使用純虛析構函數,這時候該類為抽象類,即不能進行實例化的類。
四 總結
(1) 有些基類就是為了作為base類,為了使用多態機制,那么我們需要為這些類得析構函數使用virtual。
(2) 有些類就不是為了作為base類,string 或者一些stl,那么我們就不需要使用vlirtual
(3) 基類中某個函數使用了virtual ,那么我們就需要為這個類得析構函數,使用virtual。
posted on 2011-05-03 11:30 kahn 閱讀(645) 評論(0) 編輯 收藏 引用 所屬分類: c++學習總結

