- 1、本文档共22页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C++编程思想14.pdf
下载
下载
第1 4章 多态和虚函数
多态性(在C + + 中用虚函数实现)是面向对象程序设计语言继数据抽象和继承之后的第三
个基本特征。
它提供了与具体实现相隔离的另一类接口,即把“ w h a t ”从“h o w ”分离开来。多态性提
高了代码的组织性和可读性,同时也可使得程序具有可生长性,这个生长性不仅指在项目的最
初创建期可以“生长”,而且希望项目具有新的性能时也能“生长”。
封装是通过特性和行为的组合来创建新数据类型的,通过让细节 p r i v a t e来使得接口与具体
实现相隔离。这类机构对于有过程程序设计背景的人来说是非常有意义的。而虚函数则根据类
型的不同来进行不同的隔离。上一章,我们已经看到,继承如何允许把对象作为它自己的类型
或它的基类类型处理。这个能力很重要,因为它允许很多类型(从同一个基类派生的)被等价
地看待就象它们是一个类型,允许同一段代码同样地工作在所有这些不同类型上。虚函数反映
了一个类型与另一个类似类型之间的区别,只要这两个类型都是从同一个基类派生的。这种区
别是通过其在基类中调用的函数的表现不同来反映的。
在这一章中,我们将从最基本的内容开始学习虚函数,为了简单起见,本章所用的例子经
过简化,只保留了程序的虚拟性质。
• C + +程序员的进步
C程序员似乎可以用三步进入C + + :
第一步:简单地把 C + +作为一个“更好的 C ”,因为C + +在使用任何函数之前必须声明它,
并且对于如何使用变量有更苛刻的要求。简单地用 C + +编译器编译C程序常常会发现错误。
第二步:进入“面向对象”的 C + + 。这意味着,很容易看到将数据结构和在它上面活动的
函数捆绑在一起的代码组织,看到构造函数和析构函数的价值,也许还会看到一些简单的继承,
这是有好处的。许多用过 C 的程序员很快就知道这是有用的,因为无论何时,创建库时,这些
都是要做的。然而在C + + 中,由编译器来帮我们完成这些工作。
在基于对象层上,我们可能受骗,因为无须花费太多精力就能得到很多好处。它也很容易
使我们感到正在创建数据类型—制造类和对象,向这些对象发送消息,一切漂亮优美。
但是,不要犯傻,如果我们停留在这里,我们就失去了这个语言的最重要的部分。这个最
重要的部分才真正是向面向对象程序设计的飞跃。要做到这一点,只有靠第三步。
第三步:使用虚函数。虚函数加强类型概念,而不是只在结构内和墙后封装代码,所以毫
无疑问,对于新C + +程序员,它们是最困难的概念。然而,它们也是理解面向对象程序设计的
转折点。如果不用虚函数,就等于还不懂得 O O P 。
因为虚函数是与类型概念紧密联系的,而类型是面向对象的程序设计的核心,所以在传统
的过程语言中没有类似于虚函数的东西。作为一个过程程序员,没有以往的参考可以帮助他思
考虚函数,因为接触的是这个语言的其他特征。过程语言中的特征可以在算法层上理解,而虚
函数只能用设计的观点理解。
14.1 向上映射
在上一章中,我们已经看到对象如何作为它自己的类型或它的基类的对象使用。另外,它
第14章 多态和虚函数 275
下载
还能通过基类的地址被操作。取一个对象的地址(或指针或引用),并看作基类的地址,这被
称为向上映射,因为继承树是以基类为顶点的。
我们看到会出现一个问题,这表现在下面的代码中:
函数t u n e ( ) (通过引用)接受一个i n s t r u m e n t ,但也不拒绝任何从i n s t r u m e n t派生的类。在
m a i n ( ) 中,可以看到,无需映射,就能将w i n d对象传给t u n e ( ) 。这是可接受的,在instrument 中
的接口必然存在于w i n d 中,因为w i n d是公共的从i n s t r u m e n t继承而来的。w i n d到i n s t r u m e n t 的向
上映射会使w i n d 的接口“变窄”,但它不能变得比i n s t r u m e n t 的整个接口还小。
这对于处理指针的情况也是正确的,唯一的不同是用户必须显式地取对象的地址,传给这
个
文档评论(0)