什麼叫動態建立???
建立位置型別的物件,我們可以先寫乙個建立物件的函式,要求是任何類的物件都可以使用該函式去建立,也包括後來定義的類。(你給我哪個類這個函式就能建立這個類的物件,函式在類的定義之前)
1.建乙個win32控制台程式。
2.將stdafx.h 新增標頭檔案。
3.project-->settings選單項中設定使用mfc庫
4.編寫**: //
#include "stdafx.h"
//定義支援動態建立的類
class canimal:public cobject
;implement_dyncreate(canimal,cobject)
class cdog:public canimal
;implement_dyncreate(cdog,canimal)
//建立函式
注意:
1. 派生自cobject
2. 新增動態建立的宣告巨集和實現巨集
declare_dyncreate(theclass)
implement_dyncreate(theclass,baseclass)
從語法角度來講建立物件只有下邊兩種方式,那麼我們上邊的實質是哪種呢???
① 類名 物件名(引數)
② 類名 物件名=new 類名(引數)
下邊我們做個巨集代換得到:
//#include "stdafx.h"
//定義支援動態建立的類
class canimal:public cobject
;implement_dyncreate(canimal,cobject)
class cdog :public canimal
;//implement_dyncreate(cdog,canimal)
cobject* pascal cdog::createobject()
//implement_runtimeclass(cdog, canimal, 0xffff, cdog::createobject)
afx_comdat const afx_datadef
cruntimeclass cdog::classcdog = ;
cruntimeclass* cdog::getruntimeclass() const
//建立任意支援動態建立的類的物件
void createmyobject(cruntimeclass *pclass)
int main(int argc, char* argv)
分析:1. cdog有乙個靜態變數和乙個虛函式:
createobject()-----
靜態函式,建立該類的物件。
pfnnew
為null;
在動態建立時,它是createobject
函式的位址。
2. 物件時怎麼建立出來的???
在這行加斷點除錯
cobject* pobj = pclass->createobject();
我們可以看出:
呼叫cruntimeclass::createobject()函式
在該函式中,首先判斷,m_pfncreateobject(cruntimeclass的乙個成員變數)是否為空,如果不為空,通過它呼叫cdog::createobject函式,在這個函式中,return new cdog;
通俗的我們所定義的函式將就是根據執行時類資訊,找到類的位址,然後new乙個相應物件
思考&提公升:
①這種方式顛覆了我們傳統的例項化物件的方式
②有了動態建立,底層**可以建立上層類(使用者定義的類)的物件,
MFC的六大核心機制概述
1 mfc程式的初始化工作 在mfc中所有的類都 於乙個基類 cobject。mfc程式初始化過程中,其實就是虛函式的呼叫的過程,分清呼叫執行的到底是哪乙個具體的虛函式,是父類的虛函式,還是基類的虛函式,都是至關重要的。2 rtti執行時型別識別 mfc程式執行過程中需要對類的型別進行動態的判斷。在...
初識MFC 動態建立機制
1 動態建立機制的作用 在不知道類名的情況下,將類的物件建立出來。2 動態建立機制的使用 2.1類必須從cobject派生 2.2類內必須新增宣告巨集 declare dyncreate 2.3類外必須新增實現巨集 implement dyncreate cruntimeclass createob...
RIP路由六大防環機制
防環機制 1 路由毒化 route poisoning 將故障路由度量值設定為無窮大,並傳送出去 2 水平分割 split horizon 學習到的路由項將不從原介面返回 3 毒性逆轉 poison maximum 學習到的路由度量值,設定為無窮大,並從原介面返回 4 定義最大值 define ma...