<多型與虛擬> 修正與補充
侯俊傑 1998.09.09 第一次發表於
清大.楓橋驛站(140.114.87.5) CompBook 版, programming 版, oop 版
------------------------------------------------------------------
<多型與虛擬> (ISBN 957-22-2947-8,松崗書號 2101678,1998/07 初版)
經各方指正,發現了一些筆誤、一些技術錯誤,也填補了一些個人技術盲點。
關於內容的誤失,謹向讀者致歉。除以下所列,書中另有多處重新做文字上的
修潤,這一部份因為細瑣且無關正誤,故不一一列出。
--------------------------------------------------------------------
以下是二刷之重要修改內容:
■ 新增讀者來函 2 pages,二刷感言 2 pages。
■ 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。
更正:已更正所有筆誤。
--------------------------------------------------------------------
以下是三刷修改內容:
■ 新增讀者來函 4 pages,以及附錄B「C++ 的沉迷與愛戀」8 pages
■ p.33 L-9
原文:進入 foo1() 之後再印出,
更正:進入 foo2() 之後再印出,
■ p.33 L-8
原文:的確在 foo1() 的參數複製時...
更正:的確在 foo2() 的參數複製時...
■ p.60 L1~L4
原文:CPoint3d::~CPoint3d() 都沒有被呼叫到,而它們原本(通常)用來釋放屬於
它們的記憶體(不過本例並未如此)。
更正:CPoint3d::~CPoint3d() 都沒有被呼叫到,而它們原本(通常)用來讓程式員
完成各種善後清理(clean up)工作(雖然本例並未如此)。
致謝:黃俊達先生
■ p.63 about virtual inline function
原義:virtual function 絕不可以是 inline(即使外表看起來是 inline)
更正:某些夠聰明的 compiler,例如 BCB 3,可將 virtual function
也做成 inline,但仍保留一份正常的 virtual function body 以備需要。
觀察 BCB 3 之組合語言輸出,可見端倪。
致謝:新竹 葉秉哲先生
■ p.70 下
新增一個小例(程式片段),支援 template class
■ p.75 上
更正:程式執行結果應有兩行,少列了一行如下:
J.J.Hou was graduated from NCTU in 1983
致謝:蔡天送先生
■ p.83 最後一行
原義:AddTail() 地位相當於 STL 的 generic algorithm.
更正:AddTail() 地位相當於 STL vector 的 push_back()
致謝:蔡天送先生
■ p.84 第二行
原義:GetHeadPosition() 地位相當於 STL 的 iterator::begin()。
更正:GetHeadPosition() 地位相當於 STL 的 container::begin()。
致謝:蔡天送先生
■ p.107 about hex output from cout
原義:cout 無法輸出 hex 格式
更正:使用 <iomanip.h>(iostream's parameterized manipulators)即可解決。
致謝:新竹 葉秉哲先生, Yen-Chang 先生
■ p.123 about 函式指標的轉型
原義:我無法經由 vtbl 中的函式指標呼叫它所代表的 virtual member function。
更正:將 p123 程式碼中的:
#0015 ClassAMemFuncPtr pfna = (ClassAMemFuncPtr)(*vtbl0);
改為:
#0015 ClassAMemFuncPtr pfna = (ClassAMemFuncPtr)(*(ClassAMemFuncPtr*)vtbl0);
即可。
致謝:臺南 陳星光先生
此題另有陳崑泰先生、黃肇祥先生、陳欽燦先生提供見解。
■ p.233
原義:VC 環境設定
更正:如果是 VC5,PATH 應該設定為:
set PATH=E:\DevStudio\VC\BIN;E:\DevStudio\SharedIDE\BIN
而不只是:
set PATH=E:\DevStudio\VC\BIN
致謝:盧靜秋老師
--------------------------------------------------------------------
特別提醒:
■ chap5 MFC-Lite
我為 MFC-Lite 準備了 Windows 和 ANSI 兩個版本(WinVer 和 AnsiVer)。
其中的 ANSI 版使用標準的 C/C++ runtime library 做底層工作
(檔案開關、記憶體配置等等),所以應該可以一字不改地使用
不同的 compiler 加以編譯。我已在 VC5, BCB3, G++ 2.8.1 上測試過,
並將可執行檔於 Windows console, Solaris (Sparc), FreeBSD (Pentium)
等平台上執行,均順利無誤。
■ 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