MFC六大機制之五 動態建立機制

2021-07-03 14:54:24 字數 1998 閱讀 4280

什麼叫動態建立???

建立位置型別的物件,我們可以先寫乙個建立物件的函式,要求是任何類的物件都可以使用該函式去建立,也包括後來定義的類。(你給我哪個類這個函式就能建立這個類的物件,函式在類的定義之前)

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...