MFC類別型錄網之執行期型別識別

2021-07-15 10:44:44 字數 2523 閱讀 9769

我們知道mfc具有執行時型別識別(rtti)的功能,那它究竟是怎麼實現的呢?在mfc的內部,它通過乙個叫cruntimeclass的資料結構以及幾個特殊的巨集操作來構建乙個「類別型錄」網,通過在執行時查詢該網上的資訊來判斷某個物件的所屬型別。

cruntimeclass

該類定義於afx.h中,內容如下:

struct cruntimeclass

;

在這裡,我們需要用到的字段主要有2個。

m_lpszclassname:所屬型別的類名

m_pbaseclass:指向其基類的cruntimeclass物件

好了,需要的主要資料結構就是這樣,下面來看一下幾個重要巨集的定義情況。

declare_dynamic

定義於afx.h,內容如下:

#define declare_dynamic(class_name) \

public: \

static const afx_data cruntimeclass class##class_name; \

virtual cruntimeclass* getruntimeclass() const;

如果我們如下使用:

declare_dynamic(cview)
則,編譯器會為我們替換成下面的內容:

public:

static cruntimeclass classcview;

virtual cruntimeclass* getruntimeclass() const;

也就是說,只要我們在類宣告的時候加入declare_dynamic巨集,就可以使該類擁有執行時動態型別識別的資料結構和獲得該結構的方法。

但是光有這個資料結構還是不行,我們得讓不同類之間的該資料結構產生一定的關係,這樣才能交織成一張我們需要的「網」。這個時候就需要用到另乙個重要的巨集。

implement_dynamic

定義於afx.h,內容如下:

#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) \

afx_comdat const afx_datadef cruntimeclass class_name::class##class_name = ; \

cruntimeclass* class_name::getruntimeclass() const \

其中afx_comdat和afx_datadef都是空巨集,可忽略。

另乙個巨集runtime_class定義如下:

#define runtime_class(class_name) ((cruntimeclass*)(&class_name::class##class_name))
由上可以看出,implement_dynamic巨集填充了cruntimeclass結構體中的值。

當我們寫下如下**:

class cview : public cwnd

;//在實現檔案中

implement_dynamic(cview, cwnd)

則,巨集展開後,上述**將變成:

class cview : cwnd

;//實現檔案中

const cruntimeclass cview::classcview = ;

cruntimeclass* cview::getruntimeclass() const

經過declare_dynamic和implement_dynamic兩個巨集,我們可以構建出乙個如下的執行時型別鏈:

在各個類中使用這兩個巨集可以就可以構成我們所需的「類別型錄」網。當然在cobject中,它的m_pbaseclass成員將被值為null,以表示鏈網的「盡頭」。

當我們使用iskindof函式來進行執行時型別判斷時,其操作如下:

bool cobject::iskindof(const cruntimeclass* pclass) const

return false;

}

ok,成功學習完「類別型錄」網中執行期型別識別功能。

雲計算之效能類別

經常聽到有人說磁碟很慢 網路很卡,但是沒有對比就沒有傷害,我們都知道,計算機不同元件速度差異的圖表,越往上速度越快,容量越小,越高。cpu處理乙個指令需要0.38ns左右,我們把這個時間當做基本單位1s,製作圖表 硬體所用時間 人類可以感知的時間 cpu一級快取 0.5ns 1.3s cpu二級快取...

MFC控制項之CControlBar

有時候我們經常把對話方塊和檢視結合起來,做成autocad命令輸入框 photoshop浮動框之類的效果。但很奇怪的是我看過的mfc的書上都沒有特別說明過這樣的工作該如何去做,我剛接觸mfc的時候都是通過控制非模態對話方塊來模擬的,後來才知道這些工作是通過ccontrolbar的派生類來完成的。比如...

MFC之拆分視窗

bool cmainframe oncreateclient lpcreatestruct lpcs,ccreatecontext pcontext 5 在mainfrm.cpp 原始檔的開始處,新增檢視類cdemoview 的包含檔案 include demoview.h 6 編譯並執行,結果如圖...