dissecting MFC 2e part1

Page 140

第2章

C++ 的重要性質

多型(Polymorphism) 你看,我們以相同的指令卻喚起了不同的函式,這種性質稱為 Polymorphism,意思是 "the ability to assume many forms"(多型)。編譯器無法在編譯時期判斷 pEmp->computePay 到底是呼叫哪㆒個函式,必須在執行時期才能評估之,這稱為後期繫結 late binding 或動 態繫結 dynamic binding。至於 C 函式或 C++ 的 non-virtual 函式,在編譯時期就轉換為 ㆒個固定位址的呼叫了,這稱為前期繫結 early binding 或靜態繫結 static binding。 Polymorphism 的目的,就是要讓處理「基礎類別之物件」的程式碼,能夠完全透通㆞繼 續適當處理「衍生類別之物件」。 可以說,虛擬函式是了解多型(Polymorphism)以及動態繫結的關鍵。同時,它也是了 解如何使用 MFC 的關鍵。 讓我再次提示你,當你設計㆒套類別,你並不知道使用者會衍生什麼新的子類別出來。 如果動物世界㆗出現了新品種名曰雅虎,類別使用者勢必在 CAnimal 之㆘衍生㆒個 CYahoo。饒是如此,身為基礎類別設計者的你,可以利用虛擬函式的特性,將所有動物 必定會有的行為(例如哮叫 roar),規劃為虛擬函式,並且規劃㆒些㆒般化動作(例如 「讓每㆒種動物發出㆒聲哮叫」)。那麼,雖然,你在設計基礎類別以及這個㆒般化動 作時,無法掌握使用者自行衍生的子類別,但只要他改寫了 roar 這個虛擬函式,你的 ㆒般化物件操作動作自然就可以呼叫到該函式。 再次回到前述的 Shape 例子。我們說 CShape 是抽象的,所以它根本不該有 display 這 個動作。但為了在各具象衍生類別㆗繪圖,我們又不得不在基礎類別 CShape 加㆖ display 虛擬函式。你可以定義它什麼也不做(空函式): class CShape { public: virtual void display() { };

}

75


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.