c 多型的實現 VC 訊息對映的實現

2021-09-08 06:18:01 字數 3268 閱讀 4671

多型是如何利用這個虛函式表實現的呢?看下面的**:

struct

super<?xml:namespace prefix = o />

;virtual string tostring()=0;

};class

sub: public super

};

super* s = new sub();

cout

delete s;

輸出」sub class」

vc++訊息對映的思考

郝慶欣

在學習vc++

的時候,大家都不可避免的用到訊息對映。我們都知道

c++是一種物件導向的程式語言,

vc++

中為什麼這樣來實現訊息對映呢?

首先要明白乙個包含了訊息處理的windows程式是如何工作的。

一般來說乙個包含了訊息處理的

windows

程式至少要包含兩個函式

第乙個:

int winapi winmain(

hinstance hinstance,

// handle to current instance

hinstance hprevinstance,

// handle to previous instance

lpstr lpcmdline,

// command line

int ncmdshow

// show state

);第二個:

long far pascal wndproc(hwnd hwnd,word message,word wparam,long lparam);

我們不必糾纏程式實現的細節,

!,ew國r[無]sc-2a

只要明白在第乙個函式

winmain

中要註冊

wndproc

函式,通俗一些的理解就是

winmain

告訴windows

系統,聽著,我知道你要產生很多訊息,我這裡有乙個

wndproc

函式負責處理你傳遞來的各種訊息。當然訊息的格式都是系統規定好的。

其次要明白

c++中是如何實現多型性的。

我們知道多型性實現的關鍵是晚繫結(或者稱為後期繫結),其實質就是編譯器並沒有在編譯期間指定呼叫函式的絕對位址,而是指定了某個類內部該函式的偏移位址。

為了實現上面的功能,編譯器為我們作了手腳

1、 

在每個帶有虛函式的類中,d.#$5育管網4b!t2rj管f編譯器秘密放置了乙個指標,稱為

vpointer

2、 

當系統執行時,

%x^:件+垠理|uxws專

為每個類建立乙個

vtable,

其中包含了可以呼叫虛函式位址。

3、 

vpointer

出始化,指向

vtable,

通過在vtable

中偏移,來找到正確的需要呼叫的函式位址。

然後是

mfc

window api進行的封裝

當我們利用

mfc框架開發程式的時候,尤其是開發介面應用程式的時候,必定要用到

cwnd

或者派生於

cwnd

的類。根據物件導向的設計原則,對於

cwnd

的一些通用函式,例如視窗大學改變(

onsize),

視窗移動

(onmove),

最好是在

cwnd

中宣告為虛函式,然後在繼承的類裡面過載他們。但是,這樣以來,每個相關的派生類都要有乙個

vpointer

和一套記錄

vtable,

而cwnd

中通用函式是如此至多,

cwnd

的派生類也很多,必然會導致系統在執行是占用過多的資源(記憶體),這樣顯然是不合適的。

那麼

mfc是如何實現的呢?

答案就是在

cwnd

基類中盡可能的少用虛函式,採用訊息對映機制來代替。

大家可以看一下

cwnd

的類中的函式,就會發現這一點。

afx_msgvoidonmove(intx,inty);

上面這個函式就不是虛函式。

最後的問題訊息對映是如何實現的呢?

用一句話說,就是利用巨集定義來實現面向過程的訊息處理。

例如在vc中有如下的訊息對映巨集。

begin_message_map(cmainframe, cframewnd)  //}afx_msg_map

on_command(id_font_dropdown, donothing)

end_message_map()

經過編譯後,**被替換為如下形式(這只是作講解,實際情況比這複雜得多):

//begin_message_map(cmainframe, cframewnd) 

cmainframe::newwndproc(...)

}afx_msg_map

// on_command(id_font_dropdown, donothing)

case(wm_command):

if(hiword(wp)==id_font_dropdown)

break;

//end_message_map() }

}這樣,

~z[._r理業供v[供~y

kkpuq}72v}[kne育教垠@

c絡rcp;6=+k專^}t3rk

$%q軟\%育hks理a;b+垠rl垠

$h無lg'網t垠g的

vc++

就消除了對部分虛函式的需要,從而節省了記憶體空間。

c 多型的實現 VC 訊息對映的實現

多型是如何利用這個虛函式表實現的呢?看下面的 struct super virtual string tostring 0 class sub public super super s new sub cout delete s 輸出 sub class vc 訊息對映的思考 在學習vc 的時候,大...

MFC 訊息對映的實現

訊息對映的實現 windows訊息概述 windows應用程式的輸入由windows系統以訊息的形式傳送給應用程式的視窗。這些視窗通過視窗過程來接收和處理訊息,然後把控制返還給windows。訊息的分類 佇列訊息和非佇列訊息 從訊息的傳送途徑上看,訊息分兩種 佇列訊息和非佇列訊息。佇列訊息送到系統訊...

C 多型的實現

封裝 繼承 多型,物件導向的三大特性,前兩項理解相對容易,但要理解多型,特別是深入的了解,對於初學者而言可能就會有一定困難了。我一直認為學習oo的最好方法就是結合實踐,封裝 繼承在實際工作中的應用隨處可見,但多型呢?也許未必,可能不經意間用到也不會把它跟 多型 這個詞對應起來。在此拋磚引玉,大家討論...