精華區beta CompBook 關於我們 聯絡資訊
作者: 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 )