第12章派生类.doc

  1. 1、本文档共12页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第12章派生类第12章派生类

第12章 派生类 没必要时不重复任何东西。 -W.Occam 12.1引言 C++从Simula那里借来了以类作为用户定义类型的概念,以及类层次结构的概念。此外,它还借来了有关系统设计的思想:类应该用于模拟程序员的和应用的世界里的那些概念。C++提供了一些语言结构以直接支持这些设计概念。但在另一方面,使用支持设计概念的语言特征与最有效地使用C++还是有所不同,如果只使用这些语言结构作为对更传统程序设计的类型的一种表示形式,那就更是丢掉了C++最关键最强有力的东西。 一个概念不会孤立地存在,它总与一些相关的概念共存,并在与相关概念的相互关系中表现出它的大部分力量。举个例子,请试一试去解释什么是汽车,很快你就会引出许多概念:车轮、引擎、司机、人行横道线、卡车、救护车、公路、汽油、超速罚单、汽车旅店等。因为我们要用类表示概念,问题就变成了如何去表示概念之间的关系。然而,我们无法直接在程序语言里表述任意的关系。即使能这样做,我们也未必想去做它。我们的类应该定义的比日常概念更窄一些——而且也更精确。派生类的概念及其相关的语言机制使我们能表述一种层次性的关系,也就是说,表述一些类之间的共性。例如,圆和三角形的概念之间有关系,因为它们都是形状,即它们共有着形状这个概念。因此,我们就必须明确地定义类Circle和类Triangle,使之共有类Shape。在程序里表示出一个圆和一个三角形,然而却没有涉及到形状的概念,就应该认为是丢掉了某些最基本的东西。本章就是对这个简单思想的内涵的一个探索,这个思想就是通常称为面向对象的程序设计的基础。 这里对语言特征和技术的展示仍将从简单而具体的事物开始,逐步进展到更复杂更抽象的事物。对于大部分程序员而言,这也是从熟悉之物到更加未知的世界的一个旅程。这并不是从“糟糕的老技术”到“惟一的正确途径”的简单过渡。当我指出某种技术的局限性,作为通往另一种技术的推动力时,我总是在一个特定问题的环境中做这件事情;而对于不同的问题或者其他环境,第一种技术很可能反而成为更好的选择。人们已经用这里展示的所有技术构造出许许多多实用软件。这里的目标就是帮助你获得对这些技术的充分理解,以便在面对实际问题时,能在它们之中做出明智的有条不紊的选择。 在这一章里,我要首先介绍支持面向对象程序设计的基本语言特征;而后将在一个大例子的环境中,讨论如何使用这些特征去开发结构良好的程序。支持面向对象程序设计的其他特征,例如多重继承和运行时类型识别,将在第15章讨论。 12.2派生类 现在来考虑做一个程序,处理某公司所雇佣人员的问题。这个程序可能包含如下的一种数据结构: (见英文版) 下一步,我们可能需要去定义经理: (见英文版) 一个经理同时也是一个雇员,所以在Manager对象的emp成员里存储着Employee数据。这对于读程序的人而言是很明显的——特别是细心的读者,但是却没有给编译器或者其他工具提供有为manager也是Employee的任何信息。一个Manager*就不是Employee*,所以,在要求一个的地方也就无法简单地使用另一个。特别是,如果不写出一些特殊代码,你将无法把一个Manager放进一个Employee的表里。我们当然可以做这件事,或者是对Manager*做显式的类型转换,或者是将其emp成员的地址存人Employee的表。但是,这两种解决方案都不优美,也都是相当不清晰的。正确的途径应该能够把Manager也是Employee的事实明确地表述出来,再加上少量的信息: (见英文版) 这个Manager是由Employee派生的,反过来说就是,Employee是Manager的一个基类。类Manager包含了类Employee的所有成员(first_name, department等),再加上它自己的一些成员(group,level等)。 派生关系常用图形表示,画出从派生类到基类的一个箭头,指明派生类引用了它的基类(而不是相反):派生类常常被说成是从它的基类继承了各种性质,因此这个关系也被称为继承。基类有时被称做超类,派生类被称做子类。然而这一对术语却常常把人们搞胡涂,因为他们看到派生类对象的数据是基类对象的数据的一个超集。派生类通常都比基类更大,即是说它保存了更多数据,提供了更多的函数。 对于派生类概念的一种常见且有效的实现方式,就是将派生类的对象也表示为一个基类的对象,只是将那些特别属于派生类的信息附加在最后。例如, (见英文版) 按照这种方式从Employee派生出Manager,就使Manager成为Employee的一个子类型,使Manager可以用在能够接受Employee的任何地方。例如,我们现在就可以建立起一个Employee的表,而其中的一些元素Manager: (见英文版) 因为Manager(也

文档评论(0)

yyanrlund + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档