《高级语言程序设计》课件第11章继承和多态.pptx
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《《高级语言程序设计》课件第11章继承和多态.pptx》由用户(momomo)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 高级语言程序设计 高级语言程序设计课件第11章 继承和多态 高级 语言程序设计 课件 11 继承
- 资源描述:
-
1、第11章 继承和多态11.1 继承的概念11.2 派生类的定义11.3 派生类成员的访问属性11.4 派生类的构造函数11.5 基类与派生类的转换11.6 多态的概念11.7 函数重载11.8 虚函数11.9 静态关联与动态关联11.10 运算符重载及其重载规则第11章 继承和多态11.1 继承的概念第11章 继承和多态一个新类从已有的类那里获得其特性,这种现象称为类的继承。通过继承,一个新建子类从已有的父类那里获得父类的特性。从另一角度说,从已有的类(父类)产生一个新的子类,又称为类的派生。继承是一种连接类的层次模型,提供了一种明确表述共性的方法。派生是继承的产物,派生是通过继承基类中原有的
2、特性,并在此基础上修改原有功能或添加一些新的功能来产生新的类。从图11-1中可以看出,小学生、中学生、大学生、研究生是学生的具体化,他们是在学生的共性基础上增加某些特点形成的子类。学生是对各类学生共性的综合,是对各类具体学生特点的抽象。基类综合了派生类的公共特征,派生类则在基类的基础上增加某些特性,把抽象类变成具体的、实用的类型。类的继承是用已有的类来建立新类的编程技术。派生类继承了基类的所有数据成员和成员函数,并可以对成员作必要的增加或调整。一个基类可以派生出多个派生类,每一个派生类又可以作为基类再派生出新的派生类,因此基类和派生类是相对而言的。一代一代地派生下去,就形成类的继承层次结构。相
3、当于一个大家族,里面有很多分支,所有的子孙后代都继承了父辈的基本特征,同时又根据需要调整和扩充了原有特征。第11章 继承和多态一个派生类只从一个基类派生,这称为单继承,这种继承关系所形成的层次是一个树形结构,如图11-1所示。此外,一个派生类不仅可以从一个基类派生,还可以从多个基类派生。也就是说,一个派生类有两个或多个基类(一个子类可以有两个或多个父类),这称为多重继承。第11章 继承和多态11.2 派生类的定义第11章 继承和多态声明派生类的一般形式为继承方式包括public(公用的)、private(私有的)和protected(受保护的)。继承方式是可选的,如果不写此项,则默认为priv
4、ate(私有的)。派生类中的成员包括从基类继承过来的成员和自己增加的成员两大部分。从基类继承的成员体现了派生类从基类继承而获得的共性,而新增加的成员体现了派生类的个性,如图11-2所示。第11章 继承和多态实际上,并不是把基类的成员和派生类自己增加的成员简单地加在一起就成为派生类。构造一个派生类包括三部分工作:(1)从基类接收成员。派生类把基类全部的成员接收过来。这个过程是没有选择的,只能接收基类的全部成员,不能只接收其中一部分成员,舍弃另一部分成员。(2)调整从基类接收的成员。从基类接收成员是没有选择的,但可以对这些成员作某些调整。例如,可以改变基类成员在派生类中的访问属性,这是通过指定继承
5、方式来实现的。可以在派生类中声明一个与基类成员同名的成员,则派生类中的新成员会覆盖基类的同名成员。但应注意,如果要覆盖基类的成员函数,应使用相同的函数名和参数列表。采用这样的方法可以用新成员取代基类的成员。(3)在声明派生类时增加成员。这部分新增的成员,体现了派生类对基类功能的扩展。注意要根据需要仔细考虑应当增加哪些成员,精心设计。最后,在声明派生类时,一般还应当自己定义派生类的构造函数和析构函数,因为构造函数和析构函数是不能从基类继承的。派生类是基类定义的延续。在实际工作中,可以先声明一个基类,在此基类中只提供某些最基本的功能,而另外一些功能并未实现,然后在声明派生类时加入某些具体的功能,形
6、成适用于某一特定应用的派生类。通过对基类声明的延续,将一个抽象的基类转化成具体的派生类。因此,派生类是抽象基类的具体实现。第11章 继承和多态11.3 派生类成员的访问属性第11章 继承和多态既然派生类中包含基类成员和派生类自己增加的成员,就产生了这两部分成员的关系和访问属性的问题。不同的继承方式决定了基类成员在派生类中的访问属性。(1)公用继承:基类的公用成员和保护成员在派生类中保持原有的访问属性,派生类无法访问基类的私有成员。(2)私有继承:基类的公用成员和保护成员在派生类中成了私有成员,派生类无法访问基类的私有成员。(3)保护继承:基类的公用成员和保护成员在派生类中成了保护成员,派生类无
7、法访问基类的私有成员。保护成员的意思是:不能被外界引用,但可以被派生类的成员引用。11.3.1 公用继承在定义一个派生类时将基类的继承方式指定为public的,称为公用继承;用公用继承方式建立的派生类称为公用派生类,其基类称为公用基类。采用公用继承方式时,基类的公用成员和保护成员在派生类中仍然保持其公用成员和保护成员的属性,而基类的私有成员在派生类中并没有成为派生类的私有成员,它仍然是基类的私有成员,只有基类的成员函数可以引用它,而不能被派生类的成员函数引用,因此就成为派生类中的不可访问的成员。私有成员体现了数据的封装性,隐藏私有成员有利于大规模程序开发。如果把基类的私有成员的访问权限都原封不
8、动地继承到派生类,使基类的私有成员在派生类中仍保持其私有性质,派生类成员能访问基类的私有成员,这就破坏了数据的封装性。因此,不论是何种继承方式,基类的私有成员对派生类来讲都是不可访问的。第11章 继承和多态11.3.2 私有继承在声明一个派生类时将基类的继承方式指定为private的,称为私有继承;用私有继承方式建立的派生类称为私有派生类,其基类称为私有基类。私有基类的公用成员和保护成员在派生类中的访问属性相当于派生类中的私有成员,即派生类的成员函数能访问它们,而在派生类外不能访问它们。私有基类的私有成员在派生类中成为不可访问的成员,只有基类的成员函数可以引用它们。一个基类成员在基类中的访问属
9、性和在派生类中的访问属性可能是不同的。私有基类的成员可以被基类的成员函数访问,但不能被派生类的成员函数访问。图11-3表示了Student各成员在派生类中的访问属性。既然声明为私有继承,就表示将原来能被外界引用的成员隐藏起来,不让外界引用。所以,私有基类的公用成员和保护成员就成为派生类中的私有成员。私有基类的私有成员按规定只能被基类的成员函数引用,它们在派生类中是不可见的和不可访问的。第11章 继承和多态(1)不能通过派生类对象引用从私有基类继承过来的任何成员。(2)派生类的成员函数不能访问私有基类的私有成员,但可以访问私有基类的公用成员。11.3.3 保护继承“受保护”与private和pu
10、blic一样,是用来声明成员的访问权限的。由protected声明的成员称为“受保护的成员”,或简称“保护成员”。保护成员不能被类外访问,这点和私有成员相同。从类的用户角度来看,保护成员等价于私有成员。如果基类声明了私有成员,那么任何派生类都不能访问基类的私有成员;若希望在派生类中能访问它们,应当把这些成员声明为保护成员。如果在一个类中声明了保护成员,就意味着该类可能要用作基类,在它的派生类中会访问这些成员。在定义一个派生类时将基类的继承方式指定为protected的,称为保护继承,如图11-4所示;用保护继承方式建立的派生类称为保护派生类,其基类称为保护基类。保护继承的特点是:(1)保护基类
11、的所有成员在派生类中都被保护起来,类外不能访问,公用成员和保护成员可以被其派生类的成员函数访问。(2)基类的私有成员被派生类继承后变为不可访问的成员,派生类中的一切成员均无法访问它们。如果需要在派生类中引用基类的某些成员,应当将基类的这些成员声明为protected,而不要声明为private。(3)比较一下私有继承和保护继承可以发现,在直接派生类中,以上两种继承方式的作用实际上是相同的:在类外不能访问任何成员,而在派生类中可以通过成员函数访问基类中的公用成员和保护成员。第11章 继承和多态第11章 继承和多态11.4 派生类的构造函数 第11章 继承和多态以前介绍过的类,其数据成员都是标准类
12、型(如int、char)或系统提供的类型(如string),实际上,类的数据成员中还可以包含类对象,如可以在声明一个类时包含如下的数据成员:这时,roommate就是类对象中的内嵌对象,称为子对象(subobject),即对象中的对象。归纳起来,定义派生类构造函数的一般形式为 执行派生类构造函数的顺序是:调用基类构造函数,对基类数据成员初始化;调用子对象构造函数,对子对象的数据成员初始化;对派生类数据成员初始化。第11章 继承和多态11.5 基类与派生类的转换第11章 继承和多态公用继承是最常见的,也只有公用继承能较好地保留基类的特征。公用继承保留了除构造函数和析构函数外的基类所有成员,基类的
13、公用或保护成员的访问权限在派生类中都按原样保留了下来,在派生类外可以调用基类的公用成员函数以访问基类的私有成员。因此,公用派生类具有基类的全部功能,所有基类能够实现的功能,公用派生类都能实现。而私有派生类或保护派生类不能实现基类的全部功能。因此,从某种意义上讲,只有公用派生类才是基类真正的子类型,它完整地继承了基类的功能。不同类型数据之间在一定条件下可以进行类型的转换。例如,整型数据可以赋值给双精度型变量,在赋值之前,先把整型数据转换成双精度型数据。这种不同类型数据之间的自动转换和赋值,称为赋值兼容。基类与派生类对象之间有赋值兼容关系,可以进行类型间的转换。由于派生类中包含从基类继承的成员,因
展开阅读全文