文档详情

C++duotai(补足六个汉字).pdf

发布:2018-12-26约2.17万字共22页下载文档
文本预览下载声明
下载 下载 第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 的整个接口还小。 这对于处理指针的情况也是正确的,唯一的不同是用户必须显式地取对象的地址,传给这 个
显示全部
相似文档