MFC中的執行時型別識別 RTTI

2021-06-27 23:36:01 字數 4128 閱讀 1930

rtti是runtime type identification的縮寫,中文名為「執行時型別識別」。

mfc早在編譯器支援rtti之前,就有了這種能力。我們現在要以相同的手法,在console程式中**出來。我希望我的類庫具備iskindof 的能力,能在執行期偵測到某個物件是否屬於某個類,並傳回true 或 false。以形狀 shape為例 ,我希望:

即 長方形屬於「長方形類」,正方形屬於「長方形類」,圓不屬於「長方形類」,原因是長方形派生 正方形類。

cmydoc 屬於「cmydoc類」,cmydoc也屬於「cdocument類」,cmydoc也屬於「ccmdtarget類」 ,cmydoc不屬於「cwnd類」 。原因是ccmdtarget派生cdocument類,cdocument 派生 cmydoc類。

同時,我希望,每乙個類都能擁有這樣乙個cruntimeclass 成員變數,並且最後有一定的命名規則(例如,在類名稱之前冠以「class」作為它的名稱),然後,經由某種手段將整個類庫構建好之後,「類別型錄」就能呈現如下圖(2)所示的面貌:

圖(2)「類別型錄」的鍊錶形式

下面,以控制台應用程式frame3為例,模擬mfc的rtti功能。

在案例frame3 的cpp 檔案中,有這樣的操作:

implement_dynamic(ccmdtarget,cobject)

implement_dynamic(cwinthread,ccmdtarget)

implement_dynamic(cwnd,ccmdtarget) //其實在mfc中此句是,implement_dyncreate()

implement_dynamic(cframewnd,cwnd) //其實在mfc中此句是,implement_dyncreate()

implement_dynamic(cdocument,ccmdtarget)

implement_dynamic(cview,cwnd)

於是,組織出如圖(3-1)所示的一張大網:

為了證明,程式中存在整個「

類別型錄網

」。我在main函式中呼叫 printallclasses ,把鍊錶中的每乙個元素的類名稱、物件大小,以及scheme.no,列印出來。

void printallclasses() //輸出「類別型錄網「

}

效果如下:

圖(4)鍊錶中的每乙個元素的類名稱、物件大小,以及scheme.no,說明存在該「類別型錄網」

詳細**如下:

#define bool int

#define true 1

#define false 0

#define lpcstr lpstr

typedef char* lpstr;

#define uint int

#define pascal _stdcall

#include class cobject;

struct cruntimeclass

;struct afx_classinit

;#define runtime_class(class_name) \

(&class_name::class##class_name)

#define declare_dynamic(class_name) \

public: \

static cruntimeclass class##class_name; \

virtual cruntimeclass* getruntimeclass() const;

#define _implement_runtimeclass(class_name, base_class_name, wschema, pfnnew) \

static char _lpsz##class_name = #class_name; \

cruntimeclass class_name::class##class_name = ; \

static afx_classinit _init_##class_name(&class_name::class##class_name); \

cruntimeclass* class_name::getruntimeclass() const \

\#define implement_dynamic(class_name, base_class_name) \

_implement_runtimeclass(class_name, base_class_name, 0xffff, null)

class cobject

cobject::~cobject()

virtual cruntimeclass* getruntimeclass() const;

public:

static cruntimeclass classcobject;

};class ccmdtarget : public cobject

ccmdtarget::~ccmdtarget()

};class cwinthread : public ccmdtarget

cwinthread::~cwinthread()

virtual bool initinstance()

virtual int run()

};class cwnd;

}return true;

}virtual bool initinstance()

virtual int run()

};class cdocument : public ccmdtarget

cdocument::~cdocument()

};class cwnd : public ccmdtarget

cwnd::~cwnd()

virtual bool create();

bool createex();

virtual bool precreatewindow();

};class cframewnd : public cwnd

cframewnd::~cframewnd()

bool create();

virtual bool precreatewindow();

};class cview : public cwnd

cview::~cview()

};// global function

#include "my.h"

cmyframewnd::cmyframewnd()

void printallclasses() //輸出「類別型錄網「

}void main()

#include #include "mfc.h"

;class cmyframewnd:public cframewnd

};class cmydoc:public cdocument

cmydoc::~cmydoc(){}

};class cmyview:public cview

cmyview::~cmyview(){}

};//global function

void printallclasses();

#include "my.h"

cmyframewnd::cmyframewnd()

void printallclasses() //輸出「類別型錄網「

}void main()

執行時型別識別

執行時的型別識別 rtti 分為兩類 1.typeid操作符 2.dynamic cast操作符 先看第二種 dynamic cast完成將基類型別的指標或者引用安全轉化為派生類型別的指標和引用。對於指標,如果轉化失敗,則將指標置為null,對於引用型別,因為沒有null,所以直接丟擲bad cas...

執行時型別識別

q1 執行時型別識別 rtti 簡述 通過下面兩個操作符實現rtti 1 typeid 操作符,返回指標或引用所指物件的實際型別 2 dynamic cast操作符,將基類型別的指標或引用安全的轉換為派生型別的指標或引用對於帶虛函式的類,在執行時執行rtti操作符,對其他型別,在編譯時計算rtti操...

MFC六大關鍵技術之執行時型別識別(RTTI)

什麼是rtti 執行時型別識別 rtti 即是程式執行過程中知道某個物件屬於某個類。實現過程 定義cruntimeclass結構體描述類別 struct cruntimeclass 為了實現執行時識別的目的mfc定義了下列兩個巨集 declare dynamic implement dynamic ...