派生类的构造函数与析构函数.PPT

上传人:国*** 文档编号:361256 上传时间:2018-09-27 格式:PPT 页数:38 大小:363.50KB
下载 相关 举报
派生类的构造函数与析构函数.PPT_第1页
第1页 / 共38页
派生类的构造函数与析构函数.PPT_第2页
第2页 / 共38页
派生类的构造函数与析构函数.PPT_第3页
第3页 / 共38页
派生类的构造函数与析构函数.PPT_第4页
第4页 / 共38页
派生类的构造函数与析构函数.PPT_第5页
第5页 / 共38页
点击查看更多>>
资源描述

1、2018/9/27,1,派生类的构造函数与析构函数,第三章 继承,1,3,2,继承方式,类的继承与派生,4,虚基类,5,聚合类,6,继承应用实例,本章内容,2018/9/27,2,3.1 类的继承与派生,3.1.1 继承与派生实例继承是软件重用的一种形式。继承是将自然界中存在的普遍和特殊关系用程序设计的方式进行分类描述;在设计新类时,允许重用某个原有类的所有特征,并在此基础上添加新类的新特征。被重用的原有类称为基类base class而新创建的类称为派生类derived class。派生类不会影响到原有类的结构。,2018/9/27,3,实例:某一小型公司的实例,2018/9/27,4,3.1

2、 类的继承与派生,针对该公司的情况,先设计:一个一般员工类CCompanyStaff,代表员工的共性;让三个新类分别继承一般员工类CCompanyStaff,然后根据各自的差异性,新类可以对继承来的内容进行改造。,2018/9/27,5,3.1.2 派生类的定义从已有类产生新类的过程就是类的派生。定义语法如下: class :,: ;,3.1 类的继承与派生,2018/9/27,6,继承方式分为三种关键字: public private protected;单继承(只有一个基类名)和多继承;该公司情况类代码: 企业员工类 相关派生类 P79经理、销售人员、行政人员这三个派生类在声明语句中分别指

3、定了它们的基类CCompanyStaff, 以及它们的继承方式public;CSaleManager类,同时继承经理类Cmanager和销售人员类Csaleman;,3.1 类的继承与派生,2018/9/27,7,类图,3.1.3继承的级别 增加行政主管一职,员工关系图如下:,3.1 类的继承与派生,2018/9/27,8,用C+语言描述三个类的前向引用声明,形成了一个“类家族”:class CCompanyStaff; /基类员工 /派生类行政人员继承员工 class CAdminStaff : public CCompanyStaff ; /派生类行政主管继承行政人员class CFore

4、Admin : public CAdminStaff; 基类不受派生类变化的影响;派生类继承了基类的全部数据成员和除了构造函数析构函数之外的全部成员函数,但是派生类能否访问这些成员还要受继承方式的约束;,3.1 类的继承与派生,2018/9/27,9,3.2 继承方式,3.2.1 公有继承类的继承方式有public、private和protected三种,其中private是缺省的继承方式; 公有继承:基类各成员的访问权限如果是public或protected则在派生类中保持不变而基类中的private成员对派生类不可见,如图:,2018/9/27,10,3.2 继承方式,2018/9/27,

5、11,例3.1 一个公有继承的例子:sclass3_1.h sclass3_1.cpp smain3_1.cpp 基类A的所有成员在派生类中的访问控制权限都保持不变。,3.2 继承方式,2018/9/27,12,3.2.2私有继承:基类各成员无论是何种访问权限在派生类中一律以private的身份出现,连派生类的对象也无法访问,只有派生类的函数能在类内访问它们。若要私有继承来的某些基类的成员函数在派生类中也能对外可见,需在派生类中对其成员公有化。using CAnimal: SetWeight; / 在派生类中将基类的成员函数SetWeight( )公有化using CAnimal: GetWe

6、ight; / 在派生类中将基类的成员函数GetWeight( )公有化例3.2 私有继承中的公有化:sclass3_2.h smain3_2.cpp,3.2 继承方式,2018/9/27,13,私有继承后的基类成员成为了派生类的私有成员, 实际上相当于终止了基类功能的继续派生。class : private public:using : ; / 公有化;,3.2 继承方式,2018/9/27,14,3.2.3保护继承: protected访问权限:设计基类时,在隐藏成员的同时还要允许派生类的成员能访问到,这时protected 就比private更合适;例3.3 保护权限举例:sclass3

7、_3.h smain3_3.cpp,3.2 继承方式,2018/9/27,15,使用protected修饰类成员存在的隐患,它破坏了封装; protected继承;保护继承下基类各成员的访问权限(除private外)都以protected权限出现;比较私有继承和保护继承,可以看出在直接派生类中两者的效果实际上都相同,但如果再继续派生下去就会出现区别;,3.2 继承方式,2018/9/27,16,假设有A -B 销售人员员工”中将基类CCompanyStaff设为虚基类class CSaleman : virtual public CCompanyStaff ;/ 在继承路径“销售经理经理员工”

8、中将基类CCompanyStaff设为虚基类class CManager : virtual public CCompanyStaff;/ 派生类CSaleManager成为两条继承路径的交汇点class CSaleManager : public CSaleman, public Cmanager;,3.4 虚基类,2018/9/27,28,比较使用作用域分辨符和虚基类技术 :使用作用域分辨符时基类的成员在内存中存在多个副本,通过指定基类名来唯一标识使用的是哪个副本,这样可以存放不同的数据进行不同的操作;使用虚基类技术使基类的成员在内存中只存有一个副本;,3.4 虚基类,2018/9/27,

9、29,3.4.2虚基类的初始化: 虚基类的初始化在语法上和处理一般基类一样只是调用顺序略有不同它遵循以下顺序: 1)虚基类的构造函数在非虚基类之前调用; 2)若同一层次中包含多个虚基类则按它们的声明顺序调用; 3)若虚基类由非虚基类派生而来要先调用更高级别基类的构造函数再遵循上述1和2的顺序。,3.4 虚基类,2018/9/27,30,虚基类初始化顺序的简单举例:class A; class B; class C : public A,virtual B ; 将产生如下的调用次序 B() A() C(),3.4 虚基类,2018/9/27,31,较复杂的虚基类初始化举例:,3.4 虚基类,20

10、18/9/27,32,为了避免在不同继承路径中继承来的同一成员发生多个副本的冲突可以将相应的基类设为虚基类,见源代码:sclass3_7.h smain3_7.cpp 运行结果:class Base1class Base2class Level2class Base2class Level1class Leaf,3.4 虚基类,2018/9/27,33,3.5 聚合类,3.5.1聚合类的概念 设计孤立的类是较容易的,难的是正确设计基类及其派生类;一般地如果在逻辑上A 是B 的一部分而A与B又不属于同一类范畴,则不允许B继承A的功能而是要用A和其它东西组合出B;聚合(aggregation)也是

11、实现程序代码重用的另一有效手段 ;类的聚合,就是指在一个类中内嵌其他类的对象作为成员的现象;“拥有”(has a)关系,聚合类拥有内嵌对象 ;出于信息隐藏的考虑,常将其访问权限设为“私有”。,2018/9/27,34,3.5.2聚合类中的构造函数聚合类对象在创建时作为其组成部件的内嵌对象将首先被系统创建;如果一个聚合类,同时又是一个派生类,那么它的构造函数初始化列表还应负责为基类构造函数的调用提供参数;当一个类既是聚合类又是派生类时的构造函数定义形式:: 类的初始化 ,3.5 聚合类,2018/9/27,35,例3.8 公司的每一个员工都拥有不同的教育背景,其中记录着毕业学校、最高学历等基本数

12、据。可以将教育背景抽象为一个类CEducation,拥有上述数据,并提供查询数据和显示数据等基本功能。企业员工类CCompanyStaff要使用教育背景类CEducation的功能,但是前者不能继承后者所具有的特征,因此可以把CCompanyStaff类处理成一个聚合类,在类中内嵌一个Ceducation类的对象。员工管理系统中的聚合关系:sclass3_8_companyStaff.h sclass3_8_companyStaff.cpp smain3_8.cpp,3.5 聚合类,2018/9/27,36,3.6 继承应用实例,2.6.1问题描述:该公司的员工组成很简单,主要分成经理,销售部门经理,销售人员和行政人员等几类;所有员工都具有姓名,工作编号,基本工资,奖金,当月出勤记录等数据,都拥有一定的教育背景;每个员工都存在录入和显示信息等操作,并且需要根据考勤等实际因素来发放工资;不同类别的员工计算工资的办法也各不相同; 例3.9 公司员工管理系统 ,源程序:sclass3_9_companyStaff.h sclass3_9_companyStaff.cpp smain3_9.cpp,2018/9/27,37,习题,课后习题、作业习题1习题2习题3,2018/9/27,38,Thanks!,The End,

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 重点行业资料库 > 1

Copyright © 2018-2021 Wenke99.com All rights reserved

工信部备案号浙ICP备20026746号-2  

公安局备案号:浙公网安备33038302330469号

本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。