我們知道,用c++開發的時候,用來做基類的類的析構函式一般都是虛函式。可是,為什麼要這樣做呢?下面用乙個小例子來說明:
有下面的兩個類:
class clxbase
; virtual ~clxbase() {};
virtual
void dosomething() ;
};class clxderived : public clxbase
; ~clxderived() ;
void dosomething() ;
}; **
clxbase *ptest = new clxderived;
ptest->dosomething();
delete ptest;
的輸出結果是:
do something in class clxderived!
output from the destructor of class clxderived!
這個很簡單,非常好理解。
但是,如果把類clxbase析構函式前的virtual去掉,那輸出結果就是下面的樣子了:
do something in class clxderived!
也就是說,類clxderived的析構函式根本沒有被呼叫!一般情況下類的析構函式裡面都是釋放記憶體資源,而析構函式不被呼叫的話就會造成記憶體洩漏。我想所有的c++程式設計師都知道這樣的危險性。當然,如果在析構函式中做了其他工作的話,那你的所有努力也都是白費力氣。
所以,文章開頭的那個問題的答案就是--這樣做是為了當用乙個基類的指標刪除乙個派生類的物件時,派生類的析構函式會被呼叫。
當然,並不是要把所有類的析構函式都寫成虛函式。因為當類裡面有虛函式的時候,編譯器會給類新增乙個虛函式表,裡面來存放虛函式指標,這樣就會增加類的儲存空間。所以,只有當乙個類被用來作為基類的時候,才把析構函式寫成虛函式
#ifndef __item_h__
#define __item_h__
#include "common.h"
class mario;
// 基類,和工廠類
// 分割模組(讓模組之間搞內聚,低耦合)
// 多型(虛函式)
class item : public ccsprite
; // item* item; delete item;
virtual ~item();
// 所有道具都需要呼叫的初始化工作
bool init()
mario* _mario;
static ccarray* _itemreward;
static item* _flag;
// 工廠介面
static item* create(ccdictionary* dict);
// 物件的虛介面
virtual
void move(float dt) {}
virtual
void collision() {}
virtual
void wakeup(){}
void update(float dt)
/////////
//////
//////
//////
/// 公共輔助函式
void setpositionbyproperty(ccdictionary* dict)
cctmxtiledmap* getmap()
bool isleftinwindow()
return
false;
}bool isfarawayfrommario();
itemtype _type;
};#if 0
class itemfactroy
};#endif
#endif
#include "item.h"
#include "itemmushroom.h"
#include "mario.h"
#include "itemtortoise.h"
item::~item()
item* item::create(ccdictionary* dict)
else
if (type->m_sstring == "tortoise")
return itemtortoise::create(dict);
return null;
}bool item::isoutofwindow()
return
false;
}
利用反射機制實現工廠模式
細節 命名規則類,介面名稱都得大寫 寫完 記得格式化,就算是測試 貼出來也是給人看的。不能太水。inte ce fruit public void eat class orange implements fruit class factory catch exception e return f c...
工廠模式及什麼時候用工廠模式
factory method是一種建立性模式,它定義了乙個建立物件的介面,但是卻讓子類來決定具體例項化哪乙個類.當乙個類無法預料要建立哪種類的物件或是乙個類需要 由子類來指定建立的物件時我們就需要用到factory method 模式了.簡單說來,factory method可以根據不同的條件產生不...
什麼時候用工廠模式
有個疑問 工廠模式最終不也是new個物件出來麼?呼叫者直接用new好了,何必還要用工廠模式多此一舉呢?想了半天,查了些資料,弄出了點眉目。有時候,構造物件確實只要簡單的new就可以了,但另一些時候,構造物件的過程就比較複雜,比如要有很多條件判斷啊,引數選擇啊之類的,這時候把它們交給呼叫者去做就有些不...