VisualC轻松入门第7章代码重用的机制-类继承.ppt_第1页
VisualC轻松入门第7章代码重用的机制-类继承.ppt_第2页
VisualC轻松入门第7章代码重用的机制-类继承.ppt_第3页
VisualC轻松入门第7章代码重用的机制-类继承.ppt_第4页
VisualC轻松入门第7章代码重用的机制-类继承.ppt_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章 代码重用的机制类继承,面向对象中的类继承就是在模仿生物界的繁衍和进化。类继承在大型的软件工程项目中具有重要的作用,原因在于大型的软件项目也需要不断地进化和迭代开发。本章将讲解面向对象的核心知识类继承,让读者能够树立软件分层的抽象思维,并掌握类继承的定义和使用,本章的主要修行要点如下。 多态公有继承:读者将学会继承理论中最常用的继承方式原理和使用。 protected访问控制:读者将学会在继承链中发挥作用的protected域。 抽象基类:读者将学会并理解作为接口定义的抽象基类。 私有继承和保护继承:读者将学会不常用的两种继承方式。 多继承:读者将学会使用多个基类的继承方式,并了解到该继承方式可能会产生的二义性。 类模板:读者将学会定义类模板。,7.1 自然界中的生物分类,感觉又回到了初中生物课堂,为了使C+知识不那么抽象,本章也是从自然界的生物开始讲起。众所周知,人类是属于哺乳类动物的一种,至于为什么这样归类,这个问题应该去问生物学家,我们只需要知道这样一个从属关系即可,另外,又已知哺乳动物是属于动物的一种,因此,“动物”、“哺乳动物”和“人类”可以得到如图7.1所示的从属关系。,7.2 多态公有继承,【本节示例参考:源代码C07Inheritance】 多态公有继承是指在继承关系中出现的“使用同名函数而实现不同功能”的函数定义和调用的情况,该现象在自然界中非常普遍,问读者一个很简单一个问题:人和马都会走路,因此这两类可以定义一个Walk()函数,但两者走路的方式和速度一样吗?显然是不一样的,因此,人的Walk()函数和马的Walk()函数名虽然一样,但函数体内的功能代码可以是完全不同的。如果将这种情况扩展到具有公有继承关系的情况下会怎么样呢?为了研究这个问题,本节我们继续仔细研究以下3种生物分类: 动物:具有生命+会动。 哺乳动物:具有生命+会动+哺乳+胎生。 人类:具有生命+会动+哺乳+胎生+具有较高智能+会使用工具。,7.2.1 is-a关系:A是B的一种,具有从属关系的类的关系可以称为“is-a关系”,即某个类是某个类的一种,如人类是哺乳动物的一种,哺乳动物是动物的一种。在设计具有继承关系的类时,使用类图是必不可少的,而业界最常用的类图的绘制是使用UML图,即统一建模语言(如果要学习UML,需要阅读专门的UML书籍)。由于人类是哺乳动物的一种,而哺乳动物又是动物的一种。因此,使用UML图来表示这3种类之间的关系,如图7.2所示。,7.2.2 不同类型的元素组成的数组,读者现在应该对数组非常熟悉了,它的定义无非就是这样: int a100; / 定义一个具有100个元素的int型的a数组 DataType arrayArraySize; / 定义一个具有ArraySize个元素的DataType型的array数组 不管数组怎么定义,“DataType”总是一样的,也就是说,数组元素要么都是int,要么都是double,或者要么都是某种类型,能否实现这样的需求: a0是A类型,如int。 a1是B类型,如double。 a2是C类型,如char。 。,7.2.3 虚函数与动态联编,前文讲解了“动物类”、“哺乳动物类”和“人类”三者的区别与相互之间的关系,它们之间的概念随着继承的深入将变得更为细致,如哺乳动物会比动物类多出会哺乳、胎生等行为,而人类则比一般的哺乳动物多了会学习、会工作等行为,而对于它们之间共同的行为是否也是一样呢?如三者都具有生命并且会动(具有hasLife()函数和canMove()函数),但这些行为肯定是不一样的,从基本常识可知,这些具体的行为是随着物种的不同而不同,C+模拟真实世界的这一行为采用的是虚函数,定义虚函数,可以让不同的类对象中具有相同的函数名称,但实现不同的功能。 虚拟函数又称为虚函数,是C+面向对象重要的理论知识部分。与虚函数相对的暂且称之为“普通函数”。虚函数的定义比“普通函数”只是在函数前面加了一个“virtual”关键字,定义格式如下: virtual 返回值 函数名( 参数列表 ) ;,7.3 protected用在何处,众所周知,类和C语言风格的结构体的最大区别在于类可以进行访问的控制,当然,C+语言风格的结构体也具有访问控制的功能,实际上也是一种类,类具有3个访问控制域。 public:公有,可以供外界访问。 private:私有,不能供外界访问。 protected:保护,这个是什么意思?外界能不能访问它?谁能访问它? 本书前文里一直就只出现public和private域,而对protected却没有提及,并不是笔者忽略了,而是在前文没有必要使用protected域。反过来说,protected域就是专门为继承关系的类访问控制服务的。现在假设有一个上了年纪的百万富翁,他开始打算规划自己的财产,将自己的财产分为3部分:养老金、留给儿子的遗产和捐赠社会的公益金。由于养老金是给他自己用,其他人一概不能占用,那么可以将养老金看作是private域的,而捐赠社会的公益金,则是public的,留给儿子的遗产则是protected域的,他将遗产保护起来,不给外界使用,将来留给继承自己事业的儿子。,7.4 抽象基类,【本节示例参考:源代码C07Inheritance】 在动物学分类中,一般会具体到较底层或最底层的分类,如有这样的分类:鸡,禽类;狗,哺乳类;鲤鱼,鱼类。这样的分类虽然不细致,但肯定不会出现这种的分类情况:鸡,动物类;狗,动物类;鲤鱼,动物类;因为这样的分类是没有意义且没有实用价值的。原因在于在动物学分类中,本身涉及的对象都是动物,就没有必要再将动物类作为分类另外提出来,因此,在动物学分类体系中,“动物类”是不会出现在这个分类体系中的,“动物类”这个名次虽然不使用,但也是必须的,因为它是所有细分动物类的祖先。 C+语法中关于继承也有类似于 “并不使用的动物类”的描述,C+中并不是所有类都可以实例化对象,不能实例化对象的类称为“抽象类”,抽象类“不做任何实事”,只是概括一些基本概念和行为。由于抽象类不能实例化,定义它仅仅是为了能从该类中派生出子类,由子类来实例化对象,因此抽象类往往被称为“抽象基类”(即ABC,Abstract Base Class)。,7.4.1 纯虚函数的语法形式,哺乳动物类和人类都是从动物类中继承而来的,而在动物演化过程中,虽然会随着环境和基因的复杂因素而产生基因变异,进而产生不同的物种,或学会不同的行为,如鲸鱼原本是陆地生物,返回海洋后学会了游泳,但有些行为是永远不会改变的,如前文定义的“具有生命”这个行为,并不会因为物种进化而失去了这个行为。虽然“具有生命”的行为没有消失,但一般而言,要求该行为做出某些改进,如不仅仅具有生命,而且因为进化了身体器官,生命更长了,C+模拟这一继承行为使用的是纯虚函数。纯虚函数在基类中定义,定义纯虚函数的意义在于告诉子类,这个接口是一定要继承的,并且要重写函数体,增加它的功能,简单来说就是“接口不变,功能进化”。,7.4.2 抽象基类的派生类怎么改变抽象性质,阅读到这里,可能有些读者会提出疑问,虚函数不是一样可以实现“接口不变,功能进化”的动物类进化要求吗?答案是肯定的,虚函数的确可以实现这个目标,但对于生物进化而言,往往具有强制性,如某一生物遇到艰难的自然环境,它们必须强迫自己进化的生存能力等来适应恶劣的大自然,否则,将面临物种灭亡。C+语言的纯虚函数相比虚函数的意义就在于此,纯虚函数强制要求子类必须重写该虚函数,否则,它的子类依然具有纯虚函数,子类依然是抽象类。 抽象类不能实例化,只能派生它的子类,由该子类来实例化,而且必须保证它的子类改变了“抽象”的特性,即一定要重写纯虚函数,如代码示例7.8所示。,7.5 私有继承和保护继承,前文已经详细地介绍了公有继承,既然继承可以有“公有”的,那么肯定还有“私有继承”和“保护集成”。本节介绍私有继承和保护继承,这两种继承方式的现实意义并没有比公有继承多了什么,只是语法上进行了扩展和补充,这两类继承的语法格式,如代码示例7.11所示。 代码示例7.11 私有继承和保护继承的定义 class Human : private Mammal ; / 类定义体 class Human : protected Mammal ; / 类定义体 ,7.6 多继承及其规则,有两个或两个以上基类的继承关系称为“多继承”。如已经定义了篮球运动员类和足球运动员类,要定义一个复合型运动员类,而复合型运动员类就是兼有篮球运动员和足球运动员的特性和行为,因此可以从篮球运动员类和足球运动员类多继承而来,如图7.5所示。 多继承和自然界中的物种进化也是一致的,不能出现环形进化的情况,也就是生物物种永远都是朝着适应环境和提高自身素质的方向前进,当然,也有些人会出现“返祖现象”,但这本身就是不正常的意外情况,如果C+编译器也遇到继承的“返祖现象”,那对不起,不让您编译通过。 多继承应该遵循的原则是:继承链不能有环,即如果将类图看成是一个有向图,则该有向图是可进行拓扑排序的。也可以如图7.6所示的类继承结构。但不能出现如图7.7所示的环形结构继承。在UML画图工具Microsoft Visio软件中,如果读者画出如图7.7所示的UML图,软件也会相应地作出如图7.8所示错误提示,并将错误的继承线标记为红色。,7.7 类模板的定义和使用,说到模板,读者应该很自然地想到函数模板,非常高效地生成多个函数,就像孙悟空可以用猴毛变出好多孙悟空一样。 类也可以定义相应的模板,和函数模板一样,并没有多少深奥的理论,只要掌握了语法规则即可使用,类模板的语法规则如代码示例7.13所示,该代码就是一个类模板的定义。,7.8 小结,本章专门讲解面向对象的部分,通过类继承知识的学习,要求读者在编写程序前,应先考虑程序中涉及的对象和类,并考虑这些对象有没有共性,进而考虑不同类型的对象有没有共同的特点或可以提供扩展的特性。通过本章的学习,读者应该掌握的内容如下: 公有继承:理解公有继承的派生类具有基类的数据成员和成员函数。 多态公有继承:掌握定义基类指针数组来调用不同类对象的虚函数的方法。 protected访问控制:理解protected的作用。 抽象基类:理解并掌握抽象基类的定义方法。 私有继承和保护继承:了解私有继承和保护继承,熟记这两种继承中基类的数据成员和成员函数转变为派生类时所产生的变化。 多继承:了解多继承的定义方式。 类模板:掌握类模板的定义和使用的语法规则,并理解类模板内部的生成。,本章习题,一、填空题 1在类

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论