收藏 分享(赏)

C++面向对象程序设计 第三章 继承.ppt

上传人:gnk289057 文档编号:7926752 上传时间:2019-05-30 格式:PPT 页数:62 大小:300KB
下载 相关 举报
C++面向对象程序设计 第三章 继承.ppt_第1页
第1页 / 共62页
C++面向对象程序设计 第三章 继承.ppt_第2页
第2页 / 共62页
C++面向对象程序设计 第三章 继承.ppt_第3页
第3页 / 共62页
C++面向对象程序设计 第三章 继承.ppt_第4页
第4页 / 共62页
C++面向对象程序设计 第三章 继承.ppt_第5页
第5页 / 共62页
点击查看更多>>
资源描述

1、2019/5/30,主讲教师:四川大学计算机学院,1,主讲教师: 个人主页:http:/ 主编 游洪跃 陈良银 李琳等编高等教育出版社 2006年2月出版,2019/5/30,主讲教师:四川大学计算机学院,3,本书内容,第1章 绪论 第2章 C+类和对象 第3章 继承 第4章 多态性 第5章 模板 第6章 C+常见问题 第7章 Visual C+编程基础 第8章 对话框、常用消息、菜单和工具条 第9章 单文档界面和多文档界面 第10章 图形设备接口 实验 (待安排),2019/5/30,主讲教师:四川大学计算机学院,4,提纲,派生类的构造函数与析构函数,第三章 继承,ARM Vector Ta

2、ble,FIQ,IRQ,(Reserved),Data Abort,Prefetch Abort,Software Interrupt,Undefined Instruction,Reset,1,3,2,继承方式,类的继承与派生,4,虚基类,5,聚合类,6,继承应用实例,2019/5/30,主讲教师:四川大学计算机学院,5,3.1 类的继承与派生,继承与派生实例 继承是软件重用的一种形式。继承是将自然界中存在的普遍和特殊关系用程序设计的方式进行分类描述; 在设计新类时,允许重用某个原有类的所有特征,并在此基础上添加新类的新特征。,2019/5/30,主讲教师:四川大学计算机学院,6,被重用的原

3、有类称为基类base class而新创建的类称为派生类derived class。派生类不会影响到原有类的结构。,2019/5/30,主讲教师:四川大学计算机学院,7,3.1 类的继承与派生,某一小型公司的实例:,2019/5/30,主讲教师:四川大学计算机学院,8,2019/5/30,主讲教师:四川大学计算机学院,9,3.1 类的继承与派生,针对该公司的情况,先设计: 一个一般员工类CCompanyStaff,代表员工的共性; 让三个新类分别继承一般员工类CCompanyStaff,然后根据各自的差异性,新类可以对继承来的内容进行改造。,2019/5/30,主讲教师:四川大学计算机学院,10

4、,3.1 类的继承与派生,派生类的定义 从已有类产生新类的过程就是类的派生。 定义语法如下:class :,: ;,2019/5/30,主讲教师:四川大学计算机学院,11,继承方式分为三种关键字:public、private和protected; 单继承(只有一个基类名)和多继承; 该公司情况类代码: 企业员工类 相关派生类,2019/5/30,主讲教师:四川大学计算机学院,12,3.1 类的继承与派生,经理、销售人员、行政人员这三个派生类在声明语句中分别指定了它们的基类CCompanyStaff, 以及它们的继承方式public;CSaleManager类,同时继承经理类Cmanager和销

5、售人员类Csaleman;,2019/5/30,主讲教师:四川大学计算机学院,13,3.1 类的继承与派生,继承的级别 增加行政主管一职,员工关系图如下:,2019/5/30,主讲教师:四川大学计算机学院,14,类图,2019/5/30,主讲教师:四川大学计算机学院,15,3.1 类的继承与派生,用C+语言描述三个类的前向引用声明,形成了一个“类家族”: class CCompanyStaff; /基类员工 /派生类行政人员继承员工 class CAdminStaff : public CCompanyStaff ; /派生类行政主管继承行政人员 class CForeAdmin : publ

6、ic CAdminStaff;,2019/5/30,主讲教师:四川大学计算机学院,16,3.2 继承方式,基类不受派生类变化的影响;派生类继承了基类的全部数据成员和除了构造函数析构函数之外的全部成员函数,但是派生类能否访问这些成员还要受继承方式的约束;,2019/5/30,主讲教师:四川大学计算机学院,17,3.2 继承方式,类的继承方式有public、private和protected三种, 其中private是缺省的继承方式;公有继承:基类各成员的访问权限如果是public或protected则在派生类中保持不变而基类中的private成员对派生类不可见,如图:,2019/5/30,主讲教

7、师:四川大学计算机学院,18,2019/5/30,主讲教师:四川大学计算机学院,19,例3.1 一个公有继承的例子: sclass3_1.h sclass3_1.cpp smain3_1.cpp 基类A的所有成员在派生类中的访问控制权限都保持不变。私有继承:私有继承下,基类各成员无论是何种访问权限在派生类中一律以private的身份出现,连派生类的对象也无法访问,只有派生类的函数能在类内访问它们。,3.2 继承方式,2019/5/30,主讲教师:四川大学计算机学院,20,3.2 继承方式,如果希望私有继承来的某些基类的成员函数在派生类中也能对外可见,就需要在派生类中对这些成员公有化。using

8、 CAnimal: SetWeight; / 在派生类中将基类的成员函数SetWeight( )公有化using CAnimal: GetWeight; / 在派生类中将基类的成员函数GetWeight( )公有化 例3.2 私有继承中的公有化: sclass3_2.h smain3_2.cpp,2019/5/30,主讲教师:四川大学计算机学院,21,3.2 继承方式,私有继承后的基类成员成为了派生类的私有成员, 实际上相当于终止了基类功能的继续派生。 class : private public:using : ; / 公有化 ;,2019/5/30,主讲教师:四川大学计算机学院,22,3.

9、2 继承方式,保护继承:protected访问权限:设计基类时,在隐藏成员的同时还要允许派生类的成员能访问到,这时protected 就比private更合适;例3.3 保护权限举例:,2019/5/30,主讲教师:四川大学计算机学院,23,3.2 继承方式,例3.3 保护权限举例: sclass3_3.h smain3_3.cpp,2019/5/30,主讲教师:四川大学计算机学院,24,3.2 继承方式,使用protected修饰类成员存在的隐患,它破坏了封装;protected继承;保护继承下基类各成员的访问权限(除private外)都以protected权限出现;比较私有继承和保护继承,

10、可以看出在直接派生类中两者的效果实际上都相同,但如果再继续派生下去就会出现区别;,2019/5/30,主讲教师:四川大学计算机学院,25,3.2 继承方式,假设有A -B - C这样一个继承顺序如果B私有继承A后又派生出C那么C就无法再间接继承A的成员对A功能的继承在B那儿就终止了; 而如果B保护继承A后又派生出C那么A中的公有和保护成员在B中都是保护成员因此A的功能可以被C间接继承; 在实际开发时选择恰当的继承方式;,2019/5/30,主讲教师:四川大学计算机学院,26,3.2 继承方式,多继承 (多个父类):声明多继承的语法如下: class : , , ,2019/5/30,主讲教师:

11、四川大学计算机学院,27,3.2 继承方式,多继承举例:在公司员工管理中 有时会存在多继承关系,如图:,2019/5/30,主讲教师:四川大学计算机学院,28,该关系的C+描述:,2019/5/30,主讲教师:四川大学计算机学院,29,3.3 派生类的构造函数和析构函数,构造函数:在创建派生类的对象时,系统执行派生类的构造函数而不会自动执行基类的构造函数;在设计派生类的构造函数时,不仅要为初始化派生类新增加的数据提供参数,而且还应为初始化基类数据成员提供参数,2019/5/30,主讲教师:四川大学计算机学院,30,3.3 派生类的构造函数和析构函数,相关语法:():()() ,2019/5/3

12、0,主讲教师:四川大学计算机学院,31,3.3 派生类的构造函数和析构函数,派生类构造函数的调用顺序为先父辈(基类数据)后自己(派生类新数据 ); 轿车具有交通工具的一般特征,比如轮胎数目,同时又具有轿车自身的特征,如载客人数,因此轿车继承交通工具,成为它的一个派生类。 例3.4 派生类构造函数举例: sclass3_4.h smain3_4.cpp,2019/5/30,主讲教师:四川大学计算机学院,32,3.3 派生类的构造函数和析构函数,派生类必须定义构造函数的两种情况: 派生类新增的数据成员需要定义构造函数来为其初始化; 基类定义了带参数的构造函数需要派生类为其提供参数以完成基类数据成员

13、的初始化。,2019/5/30,主讲教师:四川大学计算机学院,33,3.3 派生类的构造函数和析构函数,析构函数 当派生类对象消亡时,系统会自动调用派生类的析构函数做一些必要的清理工作; 由于在继承过程中派生类不能继承基类的析构函数,所以如果需要就只能在派生类中重新定义;,2019/5/30,主讲教师:四川大学计算机学院,34,3.3 派生类的构造函数和析构函数,在执行派生类的析构函数时基类的析构函数也将被自动调用; 析构函数调用的顺序是先派生类的析构函数,然后是基类的析构函数。 例3.5 派生类析构函数举例:sclass3_5.h smain3_5.cpp,2019/5/30,主讲教师:四川

14、大学计算机学院,35,调用类A的构造函数 调用类B的构造函数 调用类B的析构函数 调用类A的析构函数,2019/5/30,主讲教师:四川大学计算机学院,36,3.4 虚基类,声明一个虚基类 多继承中的多义性,2019/5/30,主讲教师:四川大学计算机学院,37,该关系的C+描述: VirtualBase.h(非虚基类带来的问题),2019/5/30,主讲教师:四川大学计算机学院,38,3.4 虚基类,作用域分辨符:可以通过作用域分辨符明确指定调用哪个类的接口; 其语法形式如下 : .: / 访问数据成员 .: / 访问成员函数,2019/5/30,主讲教师:四川大学计算机学院,39,作用域分

15、辨符举例: Smain3_5_B.cpp 基类可以将其设为虚基类,这样它的数据成员在内存中就只有一个副本,成员函数也只有一个映射从而解决了同名成员的唯一标识问题;,2019/5/30,主讲教师:四川大学计算机学院,40,3.4 虚基类,虚基类由virtual标识,声明语法如下: class:virtual ; 例3.6 虚基类举例: sclass3_6.h smain3_6.cpp,2019/5/30,主讲教师:四川大学计算机学院,41,使用虚基类来定义公司员工管理系统中的多继承关系:,2019/5/30,主讲教师:四川大学计算机学院,42,/ 在继承路径“销售经理销售人员员工”中将基类CCo

16、mpanyStaff设为虚基类 class CSaleman : virtual public CCompanyStaff ; / 在继承路径“销售经理经理员工”中将基类CCompanyStaff设为虚基类 class CManager : virtual public CCompanyStaff; / 派生类CSaleManager成为两条继承路径的交汇点 class CSaleManager : public CSaleman, public Cmanager;,2019/5/30,主讲教师:四川大学计算机学院,43,3.4 虚基类,比较使用作用域分辨符和虚基类技术 : 使用作用域分辨符时

17、基类的成员在内存中存在多个副本,通过指定基类名来唯一标识使用的是哪个副本,这样可以存放不同的数据进行不同的操作; 使用虚基类技术使基类的成员在内存中只存有一个副本;,2019/5/30,主讲教师:四川大学计算机学院,44,3.4 虚基类,虚基类的初始化: 虚基类的初始化在语法上和处理一般基类一样只是调用顺序略有不同它遵循以下顺序:,2019/5/30,主讲教师:四川大学计算机学院,45,1)虚基类的构造函数在非虚基类之前调用;2)若同一层次中包含多个虚基类则按它们的声明顺序调用;3)若虚基类由非虚基类派生而来要先调用更高级别基类的构造函数再遵循上述1和2的顺序。,2019/5/30,主讲教师:

18、四川大学计算机学院,46,3.4 虚基类,虚基类初始化顺序的简单举例: class A; class B; class C : public A,virtual B ; 将产生如下的调用次序 B() A() C(),2019/5/30,主讲教师:四川大学计算机学院,47,3.4 虚基类,较复杂的虚基类初始化举例:,2019/5/30,主讲教师:四川大学计算机学院,48,为了避免在不同继承路径中继承来的同一成员发生多个副本的冲突可以将相应的基类设为虚基类,见源代码: sclass3_7.h smain3_7.cpp,2019/5/30,主讲教师:四川大学计算机学院,49,class Base1

19、class Base2 class Level2 class Base2 class Level1 class Leaf,2019/5/30,主讲教师:四川大学计算机学院,50,3.5 聚合类,聚合类的概念 设计孤立的类是较容易的,难的是正确设计基类及其派生类; 一般地如果在逻辑上A 是B 的一部分而A与B又不属于同一类范畴,则不允许B继承A的功能而是要用A和其它东西组合出B;,2019/5/30,主讲教师:四川大学计算机学院,51,聚合(aggregation)也是实现程序代码重用的另一有效手段 ; 类的聚合,就是指在一个类中内嵌其他类的对象作为成员的现象;,2019/5/30,主讲教师:四

20、川大学计算机学院,52,“拥有”(has a)关系,聚合类拥有内嵌对象 ; 出于信息隐藏的考虑,一般都将其访问权限设为“私有”。,2019/5/30,主讲教师:四川大学计算机学院,53,聚合类中的构造函数 聚合类对象在创建时作为其组成部件的内嵌对象将首先被系统创建; 如果一个聚合类,同时又是一个派生类,那么它的构造函数初始化列表还应负责为基类构造函数的调用提供参数;,2019/5/30,主讲教师:四川大学计算机学院,54,当一个类既是聚合类又是派生类时的构造函数定义形式:: 类的初始化 ,2019/5/30,主讲教师:四川大学计算机学院,55,例3.8 公司的每一个员工都拥有不同的教育背景,其

21、中记录着毕业学校、最高学历等基本数据。可以将教育背景抽象为一个类CEducation,拥有上述数据,并提供查询数据和显示数据等基本功能。企业员工类CCompanyStaff要使用教育背景类CEducation的功能,但是前者不能继承后者所具有的特征,因此可以把CCompanyStaff类处理成一个聚合类,在类中内嵌一个Ceducation类的对象。,2019/5/30,主讲教师:四川大学计算机学院,56,例3.8 员工管理系统中的聚合关系: sclass3_8_companyStaff.h sclass3_8_companyStaff.cpp smain3_8.cpp,2019/5/30,主讲

22、教师:四川大学计算机学院,57,3.6 继承应用实例,问题描述: 该公司的员工组成很简单,主要分成经理,销售部门经理,销售人员和行政人员等几类; 所有员工都具有姓名,工作编号,基本工资,奖金,当月出勤记录等数据,都拥有一定的教育背景;,2019/5/30,主讲教师:四川大学计算机学院,58,每个员工都存在录入和显示信息等操作,并且需要根据考勤等实际因素来发放工资; 不同类别的员工计算工资的办法也各不相同; 例3.9 公司员工管理系统 ,源程序:,2019/5/30,主讲教师:四川大学计算机学院,59,sclass3_9_companyStaff.h sclass3_9_companyStaff.cpp smain3_9.cpp,2019/5/30,主讲教师:四川大学计算机学院,60,习题,课后习题、作业 习题1 习题2 习题3,2019/5/30,主讲教师:四川大学计算机学院,61,测试题,http:/211.83.120.3在线测试,2019/5/30,主讲教师:四川大学计算机学院,62,Thanks!,The End,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报