




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、面向对象程序设计语言C+电子科技大学示范性软件学院1第六章 继承和派生C+的类提供了良好的模块分解技术,也具有可重用软件所期望的品质:它们是相似一致的模块,通过信息隐藏,将它们的接口和实现清楚地分开来。但是,仅有这些是不够的,我们还希望在类的基础上能取得更好的可重用性和可扩充性的目标。面向对象的继承技术提供了实现上述目标的有力手段。2第六章 继承和派生 6.1派生类的概念6.1.1为什么要使用继承为什么要使用继承在自然界中,继承这个概念是非常普遍的。小猫仔继承了猫爸猫妈的特性,所以长得是猫鼻子猫眼,我们不会把它错认为是小狗。继承就是这样,会将一些本质的特性遗传给子代,使子代在很大程度上具有与父
2、代相同的性质。当然,子代同时还具有父代没有的特性。下面的两张图显示了两种不同的分类情况:3第六章 继承和派生 6.1派生类的概念6.1.1为什么要使用继承为什么要使用继承4交通工具分类层次图交通工具汽车飞机火车轿车旅行车慢车快车第六章 继承和派生 6.1派生类的概念6.1.1为什么要使用继承为什么要使用继承5动物哺乳动物爬虫动物啮齿动物猿科猫科熊猫野猫家猫动物分类层次图第六章 继承和派生 6.1派生类的概念6.1.1为什么要使用继承为什么要使用继承在最简单的情况下,一个类B继承类A或者从类A派生类B,通常将类A称为基类(父类),类B称为派生类(子类)。这时,类B的对象具有类A对象的所有特性,甚
3、至还会更多一些。也可以这样说,类B从类A派生出来。这意味着类B至少描述了与类A同样的接口,至少包含了同类A一样的数据,可以共享类A的成员函数。例61说明了类A与类B之间的这种关系。6第六章 继承和派生 6.1派生类的概念6.1.1为什么要使用继承为什么要使用继承7priApubApriApubApriBpubB第六章 继承和派生 6.1派生类的概念6.1.1为什么要使用继承为什么要使用继承继承就是从先辈处得到属性和行为特征。类的继承,是新的类从已有的类获取已有的特征;换个说法就是从已有类产生新类的过程就是派生。类的派生实际是通过扩展、更改和特殊化,从一个已知类建立一个新类的过程。通过类的派生,
4、可以建立具有共通关键特征的对象家族,从而实现父类代码的重用,这种继承和派生机制对于已有程序的发展和改进是极为有力的。可以描述基类和派生类的关系为:派生类是基类的具体化,基类是派生类的抽象。即基类综合了派生类的公共特征,派生类则在基类的基础上增加了某些特征,把抽象类变成具体的、实用的类型。8第六章 继承和派生 6.1派生类的概念6.1.1为什么要使用继承为什么要使用继承那么,派生类定义的成员能否与基类的成员同名呢? C+允许派生类可以重新定义基类的成员。如果派生类定义了与基类同名的成员,称派生类的成员覆盖了基类的同名成员。如果要在派生类中使用基类的同名成员,可以显式地使用下述类名限定符: 类名:
5、成员 来使用基类的成员。(例6-3)9第六章 继承和派生 6.1派生类的概念6.1.1为什么要使用继承为什么要使用继承一个派生类从外部看,非常类似一个基类,但内部则有不同。特别地,一个派生类没有权力访问它的基类的私有数据,就像其他任何类一样。起初一看,这似乎太严格了,然而以正确的方式考察,这样做的确有意义,一个类的私有成员对其他类(包括派生类) 不可访问的原因是确保没有其他类的成员函数依赖它们。这就允许软件适应未来的改变,赋予面向对象方法以更大的能力。10第六章 继承和派生 6.1派生类的概念6.1.1为什么要使用继承为什么要使用继承派生类的生成过程包括如下三步:(1)继承基类的所有成员:将基
6、类成员全盘吸收。这样,派生类实际上包含了他所有基类中除了构造和析构函数之外的所有成员;(2)改造基类成员:一个通过不同的派生方式改造基类成员的访问控制问题;第二个方法就是在派生类中声明一个和基类成员同名的成员覆盖基类成员进行改造;(3)增加新的成员:根据派生类的实际特征,增加不同于基类的成员。11第六章 继承和派生 6.1派生类的概念6.1.2 派生类的声明和继承方式派生类的声明和继承方式C+中,派生类的一般语法形式为 class 派生类名 : 基类类名, 基类类名, ;其中: “:”后面罗列的是基类类名表,它是由“,”隔开一串元素,每个元素都是“ 基类类名”。 表示访问描述符,称为为派生方式
7、。派生方式有私有派生(当为private或缺省时),公有派生(当为public)和保护派生(当为protected)等三种。12第六章 继承和派生 6.1派生类的概念6.1.2 派生类的声明和继承方式派生类的声明和继承方式1公有派生公有派生在公有派生情况下,基类保护成员和公有成员的访问权限在派生类中保持不变。即 基类的保护成员在派生类中仍然是保护成员 基类的公有成员在派生类中仍然是公有成员 基类的私有成员在派生类中成为派生类的不可访问成员 (例6-4)13第六章 继承和派生 6.1派生类的概念6.1.2 派生类的声明和继承方式派生类的声明和继承方式现在请大家考虑三个问题:对于公有派生,1. 派
8、生类的对象可不可以直接赋值给基类对象?2. 基类对象的引用可不可以引用一个派生类对象?3. 基类对象的指针可不可以指向一个派生类对象?14第六章 继承和派生 6.1派生类的概念6.1.2 派生类的声明和继承方式派生类的声明和继承方式三个问题的具体表述如下:class Parent ; class Child : public Parent ;Child c;Parent p = c;/?Parent& rc = c;/?Parent* pc = &c;/?15第六章 继承和派生 6.1派生类的概念6.1.2 派生类的声明和继承方式派生类的声明和继承方式三个问题的答案都是肯定的。请大家看一下父类
9、对象和子类对象的内存布局就明白为什么答案是肯定的了:16第六章 继承和派生 6.1派生类的概念6.1.2 派生类的声明和继承方式派生类的声明和继承方式当一个派生类的对象直接赋值给基类对象时,很明显地,不是所有子类对象的东西都赋给了父类对象,赋予的只是子类对象的一部分。这叫做子类对象的“切片(sliced)”。需要注意的是,如果在三个问题中将父类和子类的位置反过来,那么问题的答案就是全否。请大家自行思考问什么。17第六章 继承和派生 6.1派生类的概念6.1.2 派生类的声明和继承方式派生类的声明和继承方式2. 私有派生私有派生如果 为 private(或缺省),那么: 基类的保护成员在私有派生
10、类中是私有成员; 基类的公有成员在私有派生类中是私有成员; 基类的私有成员和不可访问成员在私有派生类中成为派生类的不可访问成员。也就是说,私有派生之后,基类的成员就再也无法在以后的派生类中发挥作用,相当于阻止了基类功能的继续派生。(例6-5)18第六章 继承和派生 6.1派生类的概念6.1.2 派生类的声明和继承方式派生类的声明和继承方式3. 保护派生保护派生C+语言还允许保护派生方式。保护派生方式下,基类的所有公有段成员和保护段成员都成为保护派生类保护段的成员;基类的私有成员和不可访问成员在保护派生类中成为派生类的不可访问成员。保护派生方式一般很少使用。19第六章 继承和派生 6.1派生类的
11、概念6.1.2 派生类的声明和继承方式派生类的声明和继承方式20publicprotectedprivatepublicprotectedprotectedprivateprotectedinaccessibleinaccessibleinaccessibleprivatePublic继承Protected继承Private继承BaseMember第六章 继承和派生 6.1派生类的概念6.1.2 派生类的声明和继承方式派生类的声明和继承方式4.静态成员的派生静态成员的派生static成员受段约束符的限制,基类和派生类共享基类的static成员。要求访问静态成员时,必须用“类名:成员”显式地说明
12、。(例6-7)21第六章 继承和派生 6.1派生类的概念6.1.2 派生类的声明和继承方式派生类的声明和继承方式5.访问声明访问声明类 D 从基类B私有派生,因而类D的派生类E不能访问间接基类 B 的所有成员,这种方法表达比较简洁。但有些时侯,这种”一刀切”的方法会带来问题。若希望类B的某几个成员还能被类E访问,而不是像现在这样全部变成类D的私有成员,让类E根本看不到。为了满足这种需要,C+提供了一种调节机制,称为访问声明,它使得 B 的某几个成员能被类 E 所访问。22第六章 继承和派生 6.1派生类的概念6.1.2 派生类的声明和继承方式派生类的声明和继承方式访问声明的形式为:(1)基类类
13、名:基类保护段或公有段数据成员;(2)基类类名:基类保护段或公有段成员函数名;23第六章 继承和派生 6.1派生类的概念6.1.2 派生类的声明和继承方式派生类的声明和继承方式对访问声明的使用需要注意以下几点: (1)访问声明不能说明任何类型。(2)访问声明仅用于派生类中恢复名字的访问权限,不允许在派生类中降低或提升基类成员的可访问性。(3)对重载函数名的访问声明将调整基类中具有该名的所有函数的访问域。24第六章 继承和派生 6.1派生类的概念6.1.3基类对象的初始化基类对象的初始化1.类等级类等级下面是一个继承链中的类等级图示: 25要在派生类中访问与派生类同名的基类成员,采用 类名:成员
14、 的方式。(例6-12)第六章 继承和派生 6.1派生类的概念6.1.3基类对象的初始化基类对象的初始化2. 基类对象的初始化基类对象的初始化在 C+ 中,派生类构造函数的声明为:派生类构造函数(变元表):基类(变元表),对象成员1(变元表),对象成员n(变元表) ;构造函数执行时仍遵循先兄长(基类),再客人(对象成员),后自己(派生类)的顺序。另一方面,执行析构函数时,先执行派生类的析构函数,再执行基类的析构函数。(例6-13-16)26第六章 继承和派生 6.2多继承6.2.1多继承的概念多继承的概念 至今所看到的例子中,派生类仅有一个直接基类,这称为单继承。但是一些类却代表两个或多个类的
15、合成。例如,两用沙发,它是一个沙发,也是一张床,两用沙发应允许同时继承沙发和床的特征,即SleepSofa继承Bed和Sofa两个类,因此多继承是指一个派生类有两个或者两个以上的直接基类。(例6-17)27第六章 继承和派生 6.2多继承6.2.1多继承的概念多继承的概念 28BedSleep()Setweight()SofawatchTV()Setweight()SleepSofafoldout ()两用沙发的类层次第六章 继承和派生 6.2多继承6.2.2虚基类虚基类 1.虚基类的概念虚基类的概念 在 C+ 中,一个类不能被多次说明为一个派生类的直接基类,但可以不止一次地成为间接基类。这就
16、导致了一些问题。为了方便说明,先介绍多继承的“类格”表示法。 派生类及其基类可用一有向无环图( DAG )表示,其中的箭头表示“由派生而来”。类的 DAG 图常称为一个“类格”。29第六章 继承和派生 6.2多继承6.2.2虚基类虚基类 class L public:int next;class A : public L ;class B : public L;30class C : public A, public Bpublic:void f() next = 0; 第六章 继承和派生 6.2多继承6.2.2虚基类虚基类 31LLABCL的数据成员A的数据成员L的数据成员B的数据成员C的数
17、据成员第六章 继承和派生 6.2多继承6.2.2虚基类虚基类 当在多条继承路径上有一个公共的基类(如本例的 L ),在这些路径中的某几条路径汇合处(如本例中的 C ),这个公共基类就会产生多个实例。也就是说,如果L中有一个叫做next的成员,那么在C中就有两个叫做next的成员。那么,下面的代码在编译时就会引起二义性错误:C Obj;Obj.next = 0;而这条使正确的:Obj.A:next = 0;32第六章 继承和派生 6.2多继承6.2.2虚基类虚基类 如果只想保存这个基类的一个实例,可以将这个公共基类说明为虚拟基类或称虚基类。它仅是简单地将关键字virtual加到基类的描述上,例如
18、改写上述例子为:class A : virtual public L ;class B : virtual public L;33BLAC第六章 继承和派生 6.2多继承6.2.2虚基类虚基类 多继承优势会将问题变复杂。所以在现代的面向对象语言,比如Java中,就取消了多继承的概念。34第六章 继承和派生 6.3继承的意义继承性是对象之间合作的另一种方式(另两种方式是友元类和对象作成员),派生类继承了基类,一个派生类对象除了可以包含基类对象,这一点和对象作成员类似,派生类还可以继承基类中的成员, 派生类对象可以在类外直接使用继承的基类公有成员。类既可看作模块又可看作类型,继承的引入使这两种观点更加明显,从模块和类型两个角度来仔细考察继承的意义。35第六章 继承和派生 6.3继承的意义
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国横鱼项目创业计划书
- 中国APM项目创业计划书
- 中国认证检验检测项目创业计划书
- 中国可见光人脸识别项目创业计划书
- 中国金针菇项目创业计划书
- 中国计算机工程项目创业计划书
- 中国光通信交换设备项目创业计划书
- 2025《混凝土搅拌站劳动合同》
- 中国电子体温计项目创业计划书
- 场景详尽电子商务代理协议书
- 基于机器学习的糖尿病早期诊断模型及可解释分析
- 路面硬化施工方案
- 学前教育安全标志课件
- 环境污染和生态破坏事故应急预案样本(2篇)
- 中北大学炸药理论复习
- T-UNP 149-2024 装配式建筑工程施工现场安全管理规范
- 铁路货物运价规则
- 《工逆向工程与增材制造》课件-19. Geomagic Design X 实体建模方法
- 医疗废物管理的相关法律法规
- 脑机接口课件
- 天涯海角景区开发规划
评论
0/150
提交评论