關於 多型與虛擬

g001.jpg (11189 bytes)

侯捷 1998.08.14


在網上看到網友們討論我的新書 多型與虛擬 (Polymorphism in C++),甚覺趣味。以下是引信:

●post1

作者 tyc.bbs@ultima.m2.ntu.edu.tw (tyc), 看板 CompBook
標題 侯俊傑的書
時間 Ultima BBS (Thu Aug 13 16:32:43 1998)
────────────────────────────────
前陣子買了侯譯的 深度探索 C++ 物件模型 (眳p)
昨天又在書局看到他寫的 C++ 的虛擬和多形(?) (松崗)
雖然書末注明了參考書目
不過感覺上後者和前者很多地方重複 (連圖示都相像)
行文間也引用前者和其他書
好像是作者譯完前者和其他書所作的重新整理....
不知看過翻過這兩本書的網友看法如何?

●post2

作者 EndlessBlue (恨情書) 看板 CompBook
標題 Re: 侯俊傑的書
時間 Thu Aug 13 21:01:45 1998
────────────────────────────────
我想侯先生所寫的 "多型與虛擬 - 物件導向的精髓" 是其譯、著:

1.深度探索 C++ 物件模型 (Inside The C++ Object Model)
2.COM 本質論 (Essential COM)
3.深入淺出 MFC

等書的心得感想結晶吧 ?!
詳細的內容 可以參考本版 第 2399 篇 "【回應讀者 --- 侯俊傑 1998 計劃】.3"

對於一般比較沒有根基的朋友而言 "深度探索 C++ 物件模型" 是難了許多 ...
而且實際應用也比較少 ?!

而 "多型與虛擬" 比較適合一般讀者,如果沒有時間閱讀 1,2,3 等書也可以從中獲得一些有用的知識 ...有看過 1,(2),3 等書的朋友 大概不用再看本書了吧 【純屬個人意見】



●post3

作者 BBFISH (發光的藍色蝴蝶魚) 看板 CompBook
標題 Re: 侯俊傑的書
時間 Fri Aug 14 08:58:15 1998
────────────────────────────────
侯大哥的 "深度探索 C++ 物件模型" 一書 , 對於一般人來說 ,
的確是頗難的說 !

但是 , 在沒有太多時間或是嫌自己英文程度不好的讀者而言 ,
"多型與虛擬" 一書會為你帶來很好的啟示 ,
小弟目前在準備研究所考試中 , 發現有兩本物件導向觀念很棒的書 ,
分別是侯大哥的 "多型與虛擬" 與 劉燈、賴明宗、賀元的 "世紀末軟體革命2" ,
尤其是在具備 C 語言的基礎下 , 看來更是如魚得水般的快樂 ,
我自己本身不是科班出身 , 所有一切都是從頭來的 DIY ,

所以,我特別能體會侯大哥在 "多型與虛擬" 一書中所揭櫫的觀念 -
" C++ 並不難學 , 問題不在學生 , 而在老師 ! "

在此 , 我特地將 "老師" 當作 "好書或引導我們入百官之門 , 一窺宗廟之富的人"!


●自己評自己

看起來,EndlessBlue (恨情書) 和 BBFISH (發光的藍色蝴蝶魚) 都已看過《多型與虛擬》一書。身為本書作者的我,覺得兩位都說到了這本書的某些精神。然而我還有補充。

《深度探索 C++ 物件模型》 (譯) 和《多型與虛擬》都不算初階書籍,尤其前者難度甚高。兩本都是出版不到一個月的新書,要在這麼短時間內看完兩本書並詳細說出其特性,是專業書評人才能做的事!臺灣的電腦專業書評人才奇缺,所以我自己來!

《多型與虛擬》有六章,各位可從以下簡介知其旨趣:

1. C++ Classes 語法和語意(Classes' Syntax and Semantics)

介紹 Classes 的各種相關語法和語意。包括 declaration, defination, inline, name mangling, function overloading, operator overloading, access level, static members, constructor, destructor, inheritance, virtual function, template, STL, namespace, RTTI...

這部份不能和 C++ 專書相比,只能說是一個重點整理,並寫一些儘量小、儘量有代表性的 samples;我特別強調 polymorphism 的應用實例,例如STL 那一小節的 sample。

2. C++ 物件模型(C++ Object Model)

C++ 物件模型的主題很廣,深度探索 C++ 物件模型全書就在探討此主題。至於本章,只探討與 polymorphism 有關的 "virtual mechanism" 這部份,也就是 vptr, vtbl;並區分單一繼承、多重繼承、虛擬繼承三種情況。

本章相關知識,我主要是從 深度探索 C++ 物件模型 3,4 兩章學習而得。不過 深度探索 一書偏重理論,以及各種編譯器的可能做法,此章則把理論介紹完畢後,以實證的精神,實際寫程式去驗證這些編譯器理論在 Visual C++ 上的實作情況。我打算在第二版(不是第二刷!)補上這些理論在 Borland C++Builder 和 GNU C++ 上的實作情況。

本章有 2~3 張圖片與 深度探索 C++ 物件模型 書中完全相同。這是因為那些圖片介紹「object layout 在多重繼承與虛擬繼承時的佈局情況」,是一種理論示意圖;在上面做任何小修改並沒有意義,所以我完全照錄,並註明資料出處。此外,容我說明,被我「完全照錄」的深度探索 C++ 物件模型書中那些圖,是譯者(我)消化原作之後,親手重繪的。原著的圖十分粗糙,並有錯誤。

3. 型別轉換(Type Casting)

本章介紹 RTTI 中的最重要角色:dynamic_cast operator。同時介紹static_cast 和 reinterpret_cast 兩個 operators。另介紹了 # 和 ## 兩個 operators,它們在第五章扮演關鍵角色。

順便藉此做一個【錯誤更正】(我將於新刷更正之):

我在《多型和虛擬》p.183 說:「 # 和 ## operator 不是 C++ Standard 所規定,而是 Microsoft 編譯器自定」。此語錯誤!事實上它們都是 C++ Standard 所規定。影響所及,第五章的程式將可以在任何一種 compiler platform 上編譯完成,不限 Visual C++。

4. 為什麼需要多型(Why Polymorphism)

對 polymorphism 的 "why" 以及 "how" 進行詳細的文字說明。有部份內容在《深入淺出 MFC》第二章出現過。

5. Polymorphism 應用實例

舉實例說明,如何自己動手完成一個有良好性質的 application framework。所謂良好性質,是指具備 RTTI、Dynamic Creation、Persistence。其中 RTTI 和 Dynamic Creation 兩主題,我曾經在《深入淺出 MFC》第三章發表過,但 Persistence 工程浩大(內含 CFile、CArchive、CObList、CDWordArray 的實作),是我的新心得。三者(RTTI、Dynamic Creation、Persistence)間的關係,在本書中也終於有了一個全盤的、良好的組織。

請特別注意,你可以從 MFC-lite(本章實例)中學習到一個application framework 的設計精髓,程式碼總共約僅 1000 行。此 framework 可以任何 compiler 編譯,在任何 platform (包括 Unix、OS/2、Windows、DOS)上有效運作。(因為我使用ANSI C runtime library 做底層動作,不使用 Win32 API)。

6. 從 C++ Object Model 邁向 Component Object Model

此章與 polymorphism 無關。由於我在第二章談到 C++ Object Model,在第三章談到 Type Cast,剛好就以此章順勢將讀者帶往 COM 基礎。這章算是 bonus。這一部份的討論,Essential COM 第一章說的更多,更細,但恐怕對大部份人而言,較難接受(因為技術層次定位的關係)。

●結論

《深度探索 C++ 物件模型》和《多型與虛擬》,兩者屬性完全不同。

《物件模型》這一主題實用性較低,難度很高。

《多型》這一主題的實用性很高。任何人寫 OO 程式,離不開多型的應用。難度嘛,本來也頗高,但我想 <多型與虛擬> 一書應該可以成功降低其難度門檻。

●讀者來信

下面是讀者直接寫給我的 email,以此做為本文結語。

侯老師您好,最近將您的那一本《虛擬與多型》看了一下,發現真的對我
有很大的幫助。幫我釐清了很多 C++ 的問題。compiler 課程或系統程式
課程,雖然有稍微提到有關方面的東西, 但都很少, 而且也不是以我熟悉的
C++ 來解釋, 因此不是很懂. 有很多東西是看了您的書之後才豁然開朗的.

但最近又在看您的另一本在 book 版上引起熱列討論的書《深度探索 C++ 物件模型》。原本在書店看了一下內容, 裡面提到這本書適合 C++ 的老手, 書中又把老手分成兩類. 本以為自己屬於第一類, 也就是對 C++ 的語法蠻熟的.也寫過很多 code但是開始看之後才發現,原來自己什麼都不是.幾乎都不知道在寫什麼啦.這兩本書的難度似乎差距不小喔...

我在《深度探索 C++ 物件模型》一書導讀(譯者的話)曾經提到該書適合的讀者群。我所指的 C++ 老手,是那種在業界真正做過 project 的軟體工程師。發信者(一位 NCTU 同學)自認為是 C++ 老手,但卻遭到「震撼」,顯然自己的實力未如自己的想像。早一點多瞭解自己,未嘗不是一件好事。

當然,C++ 老手,不是以「學生」或「工程師」的身份就能二分的。請大家不要誤會我的意思。

--- the end