网站大量收购闲置独家精品文档,联系QQ:2885784924

C++编程思想14.pdfVIP

  1. 1、本文档共22页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 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)

cai + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档