关於 多型与虚拟

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++ 物件模型 ( 峰)
昨天又在书局看到他写的 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