作者: jjhou (jjhou)
標題: <多型與虛擬> 修正與補充
時間: Wed Sep 9 17:46:39 1998
<多型與虛擬> 修正與補充
侯俊傑 1998.09.09 第一次發表於
清大.楓橋驛站(140.114.87.5) CompBook 版, programming 版, oop 版
------------------------------------------------------------------
<多型與虛擬> 經各方指正,發現了一些筆誤、一些技術錯誤,
也填補了一些個人技術盲點。以下列出關鍵部份。
關於內容的誤失,謹向讀者致歉。我將在 <多型與虛擬> 一版二刷中更正。
請 <多型與虛擬> 的讀者能幫助我,廣泛傳播此份訊息,謝謝。此文亦將置於
松崗網站供下載,並歡迎(應該說是懇請)各網站收錄。
以下列出熱心讀者的大名,表示我的謝忱。除以下所列,書中數處
筆誤亦經多位讀者來函提醒指正。細瑣,無法一一列出,謹此致謝。
■ p.32 about copy assignment operator
原義:「將一個 object 指派(assign)給另一個 object,會引發 copy constructor」
更正:這種情況下所引發的是 copy assignment operator。
致謝:陳崑泰先生,黃英典先生
■ p.42 about static member function
原義:「static data member 必須由 static member function 來處理」
更正:static data member 可被任何 function 處理(包括
static member functions, non-static member functions, global functions
-- 只要 scope 以及 access level 允許)。
致謝:新竹 林昆穎先生,徐逸輝先生
■ p.44 about static object 筆誤
原文:如果這是一個 local static object,其生命就持續到函式結束為止。
更正:如果這是一個 local static object,其生命就持續到程式結束為止。
^^^^
■ p.183 (and 導讀 p.21): about # and ## operator
原義:# 和 ## 不確定是否為 C/C++ Standard operators
更正:# 和 ## 的確是 C/C++ Standard operators
■ p.158~p.161 about JMP
原義:我在討論「Visual C++ 內部如何處理 virtual functions」時,
對於 "E9 xx xx xx xx" 的 jump 點,少加 5 個 bytes
(這 5 個 bytes 是 JMP instruction length)
更正:每一個 "E9 xx xx xx xx" 指令,jump 時應多加 5 bytes。
這麼一來,書中所列的一些疑惑也就獲得了解決。
致謝:台北 宏碁工程師(遺憾未能得知姓名)
■ p.130,136,148 about natural and unnatural
原義:數處將 natural polymorphism 誤寫為 native polymorphism,
將 unnatural polymorphism 誤寫為 non-native polymorphism。
更正:已更正所有筆誤。
--------------------------------------------------------------------
以下是二刷更新稿件交出後,才得到的重要回應:
■ p.63 about virtual inline function
原義:virtual function 絕不可以是 inline(即使外表看起來是 inline)
更正:某些夠聰明的 compiler,例如 BCB 3,可將 virtual function
也做成 inline,但仍保留一份正常的 virtual function body 以備需要。
觀察 BCB 3 之組合語言輸出,可見端倪。
致謝:新竹 葉秉哲先生
■ p.107 about hex output from cout
原義:cout 無法輸出 hex 格式
更正:使用 <iomanip.h>(iostream's parameterized manipulators)即可解決。
致謝:新竹 葉秉哲先生
■ p.123 about 函式指標的轉型
原義:我無法經由 vtbl 中的函式指標呼叫它所代表的 virtual member function。
更正:將 p123 程式碼中的:
#0015 ClassAMemFuncPtr pfna = (ClassAMemFuncPtr)(*vtbl0);
改為:
#0015 ClassAMemFuncPtr pfna =
(ClassAMemFuncPtr)(*(ClassAMemFuncPtr*)vtbl0);
即可。
致謝:臺南 陳星光先生
--------------------------------------------------------------------
特別提醒:
■ chap5 MFC-Lite
由於 # 和 ## operator 為 C/C++ 標準,所以 MFC-Lite(一個具有
美好公共基礎建設的小型 application framework)可以一字不改地使用
不同的 compiler 編譯(我已在 VC 和 BC 上測試過)。另,我還準備了
Windows 和 ANSI 兩個版本(WinVer 和 AnsiVer),其中 ANSI 版本
「理應」適用於任何作業系統(我將嘗試在各種作業系統上測試它)。
■ sample code
chap1~chap4 的 samples 都很小很細瑣(因為書中做各種嘗試),
不適合供應給讀者。chap5 and chap6 的 sample 比較大,較具實用
價值,我把它們壓縮為一個檔,並含 readme.txt,放在松崗網站
供讀者自由下載。
■ 第2章
全書程式雖然適用於各種 compiler,但第2章主題 C++ Object Model,
各家 compiler 的作法可能不同。第2章的各個實證結果,是以 Visual C++
為依據。
--- the end
--
※ Origin: 楓橋驛站<bbs.cs.nthu.edu.tw> ◆ Mail: jjhou@CCCA.NCTU.edu.tw
※ X-Info: Mave -> ric.bbs@ptt.csie.ntu.edu.tw
※ X-Sign: 0ROABKJPHgA1ldpEsi5M (99/07/09 7:04:51 )