利用工廠模式實現怪物系統

2021-07-10 09:59:44 字數 2347 閱讀 4716

我們知道,用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就可以了,但另一些時候,構造物件的過程就比較複雜,比如要有很多條件判斷啊,引數選擇啊之類的,這時候把它們交給呼叫者去做就有些不...