精華區beta CompBook 關於我們 聯絡資訊
<多型與虛擬> 修正與補充 侯俊傑 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