什麼是rtti
執行時型別識別(rtti)即是程式執行過程中知道某個物件屬於某個類。
實現過程
定義cruntimeclass結構體描述類別:
struct cruntimeclass
;
為了實現執行時識別的目的mfc定義了下列兩個巨集:
declare_dynamic / implement_dynamic
declare_dynamic:把
cruntimeclass
物件新增到類
中,並獲取該物件的地
址的函式。
#define declare_dynamic(class_name) \
public: \
static cruntimeclass class##class_name; \ //##的作用是告訴編譯器將##前後的兩個字串連線起來
virtual cruntimeclass* getruntimeclass() const;
implement_dynamic:將各個物件連線起來:
#define implement_dynamic(class_name, base_class_name) \
implement_runtimeclass(class_name, base_class_name, 0xffff, null)
其中的_
implement_
runtimeclass 又是乙個巨集。在動態生成時會用到:
#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 \
< \
runtime_class
巨集:
#define runtime_class(class_name) \
(&class_name::class##class_name)
implement_
dynamic的關鍵是使用了下面這個巨集,它完成的工作是將各個類串聯起來:
struct afx_classinit
;
其定義如下:
afx_classinit::afx_classinit(cruntimeclass* pnewclass)
;
MFC六大關鍵技術之執行時型別識別
執行時型別識別 rtti 即是程式執行過程中知道某個物件屬於某個類,我們平時用c 程式設計接觸的rtti一般是編譯器的rtti,即是在新版本的vc 編譯器裡面選用 使能rtti 然後載入typeinfo.h檔案,就可以使用乙個叫typeid 的運運算元,它的地位與在c 程式設計中的sizeof 運運...
MFC中的六大關鍵技術
1 mfc程式的初始化工作 在mfc中所有的類都 於乙個基類 cobject。mfc程式初始化過程中,其實就是虛函式的呼叫的過程,分清呼叫執行的到底是哪乙個具體的虛函式,是父類的虛函式,還是基類的虛函式,都是至關重要的。2 rtti執行時型別識別 mfc程式執行過程中需要對類的型別進行動態的判斷。在...
MFC六大關鍵技術之 三 動態建立
動態建立就是執行時建立指定類的物件,在mfc中大量使用。如框架視窗物件 視物件,還有文件物件都需要由文件模板類物件來動態的建立。我覺得這是每個mfc的學習者很希望理解的問題。初次接觸mfc的時候,很容易有這樣的迷惘。mfc的幾大類不用我們設計也就罷了,但最疑惑的是不用我們例項化物件。本來最直觀的理解...