收藏 分销(赏)

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

上传人:w****g 文档编号:2558278 上传时间:2024-05-31 格式: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、派生类的构造函数与析构函数派生类的构造函数与析构函数第三章第三章 继承继承1 13 32 2继承方式继承方式类的继承与派生类的继承与派生4 4虚基类虚基类5 5聚合类聚合类6 6继承应用实例继承应用实例本本章章内内容容2024/5/25 周六1 3.1 类的继承与派生类的继承与派生3.1.1 3.1.1 继承与派生实例继承与派生实例q继承是软件重用的一种形式。继承是将自然界中继承是软件重用的一种形式。继承是将自然界中存在的存在的普遍和特殊关系普遍和特殊关系用程序设计的方式进行分用程序设计的方式进行分类描述类描述;q在设计新类时,允许在设计新类时,允许重用某个原有类的所有特征重用某个原有类的所有

2、特征,并在此基础上并在此基础上添加新类的新特征添加新类的新特征。q被重用的原有类称为被重用的原有类称为基类基类basebase class class而新创建的而新创建的类称为类称为派生类派生类derived derived classclass。q派生类派生类不会影响到原有类的结构不会影响到原有类的结构。2024/5/25 周六2实例实例:某一小型公司的实例某一小型公司的实例企业员工企业员工工作编号工作编号姓名姓名显示企业员工信息显示企业员工信息计算实际发放工资计算实际发放工资行政人员行政人员(与与企企业业员员工工类类相相同)同)计算实际发放工资计算实际发放工资经理经理公司总销售额公司总销售

3、额提提成成比比例例(其其余余同同企业员工类)企业员工类)计算实际发放工资计算实际发放工资销售人员销售人员个人销售额个人销售额提提成成比比例例(其其余余同同企业员工类)企业员工类)计算实际发放工资计算实际发放工资2024/5/25 周六33.1 类的继承与派生类的继承与派生针对该公司的情况,先设计:针对该公司的情况,先设计:p一一个个一一般般员员工工类类CCompanyStaff,代代表表员员工工的的共共性;性;q让让三三个个新新类类分分别别继继承承一一般般员员工工类类CCompanyStaff,然然后后根根据据各各自自的的差差异异性性,新新类类可可以以对对继继承承来来的的内内容容进行改造。进行

4、改造。2024/5/25 周六43.1.2 派生类的定义派生类的定义q从已有类产生新类从已有类产生新类的过程就是类的派生。的过程就是类的派生。q定义语法如下:定义语法如下:class class:,:2 ;3.1 类的继承与派生类的继承与派生2024/5/25 周六5继承继承方式方式分为三种关键字分为三种关键字:public private protected;q单继承(只有一个基类名)和多继承;单继承(只有一个基类名)和多继承;q该公司情况类代码:该公司情况类代码:企业员工类企业员工类 相关派生类相关派生类 P79P79q经理、销售人员、行政人员这三个派生类在声明语句经理、销售人员、行政人员

5、这三个派生类在声明语句中分别指定了它们的基类中分别指定了它们的基类CCompanyStaff,以及它以及它们的继承方式们的继承方式public;qCSaleManager类,类,同时继承经理类同时继承经理类Cmanager和销售和销售人员类人员类Csaleman;3.1 类的继承与派生类的继承与派生2024/5/25 周六6销售员销售员经理经理行政主管行政主管行政人员行政人员企业员工企业员工类图类图3.1.3继承的级别继承的级别 增加行政主管一职,员工关系图如下:增加行政主管一职,员工关系图如下:3.1 类的继承与派生类的继承与派生2024/5/25 周六7q用用C+语语言言描描述述三三个个类

6、类的的前前向向引引用用声声明明,形形成成了了一一个个“类家族类家族”:class CCompanyStaff;/基类员工基类员工 /派生类行政人员继承员工派生类行政人员继承员工 class CAdminStaff:public CCompanyStaff;/派生类行政主管继承行政人员派生类行政主管继承行政人员class CForeAdmin:public CAdminStaff;q基类不受派生类变化的影响;基类不受派生类变化的影响;q派派生生类类继继承承了了基基类类的的全全部部数数据据成成员员和和除除了了构构造造函函数数析析构构函函数数之之外外的的全全部部成成员员函函数数,但但是是派派生生类类

7、能能否否访问这些成员还要受继承方式的约束访问这些成员还要受继承方式的约束;3.1 类的继承与派生类的继承与派生2024/5/25 周六83.2 3.2 继承方式继承方式3.2.1 3.2.1 公有继承公有继承q类的继承方式有类的继承方式有public、private和和protected三三种,种,其中其中private是缺省的继承方式;是缺省的继承方式;q 公有继承:公有继承:基类各成员的基类各成员的访问权限访问权限如果是如果是public或或protected则在派生类中保持不变而基类中的则在派生类中保持不变而基类中的private成员对派生类成员对派生类不可见不可见,如图:,如图:202

8、4/5/25 周六9privateprivate基类基类Base图图3.3 公有继承中的访问控制公有继承中的访问控制protectedprotectedpublicpublicprivateprivate派生类派生类Derv:public BaseprotectedprotectedpublicpublicDerv objDBase objB3.2 继承方式继承方式2024/5/25 周六10 q例例3.1 3.1 一个公有继承的例子一个公有继承的例子:sclass3_1.h sclass3_1.cpp smain3_1.cpp q 基基类类A A的的所所有有成成员员在在派派生生类类中中的的访

9、访问问控控制制权权限限都都保持不变保持不变。3.2 3.2 继承方式继承方式2024/5/25 周六113.2.23.2.2私有继承:私有继承:q基基类类各各成成员员无无论论是是何何种种访访问问权权限限在在派派生生类类中中一一律律以以privateprivate的的身身份份出出现现,连连派派生生类类的的对对象象也也无无法法访访问问,只有派生类的函数能在类内访问它们。只有派生类的函数能在类内访问它们。q若若要要私私有有继继承承来来的的某某些些基基类类的的成成员员函函数数在在派派生生类类中也能对外可见,中也能对外可见,需在派生类中对其成员公有化需在派生类中对其成员公有化。using CAnimal

10、:SetWeight;/在派生类中将在派生类中将基类的成员函数基类的成员函数SetWeight()公有化公有化using CAnimal:GetWeight;/在派生类中将在派生类中将基类的成员函数基类的成员函数GetWeight()公有化公有化q例例3.2 3.2 私有继承中的公有化私有继承中的公有化:sclass3_2.h smain3_2.cpp 3.2 继承方式继承方式2024/5/25 周六12q 私私有有继继承承后后的的基基类类成成员员成成为为了了派派生生类类的的私私有有成成员员,实际上相当于实际上相当于终止了基类功能的继续派生。终止了基类功能的继续派生。class :privat

11、e public:using:;/公有化公有化;3.2 继承方式继承方式2024/5/25 周六133.2.33.2.3保护继承:保护继承:q protectedprotected访问权限:访问权限:设计基类时,在隐藏成员的同时还要允许派生设计基类时,在隐藏成员的同时还要允许派生类的成员能访问到,这时类的成员能访问到,这时protected protected 就比就比privateprivate更合适;更合适;例例3.3 3.3 保护权限举例保护权限举例:sclass3_3.h smain3_3.cpp3.2 继承方式继承方式2024/5/25 周六14q使用使用protectedprote

12、cted修饰类成员存在的隐患,它修饰类成员存在的隐患,它破坏了破坏了封装封装;q protectedprotected继承继承;保保护护继继承承下下基基类类各各成成员员的的访访问问权权限限(除除privateprivate外外)都以都以protectedprotected权限出现;权限出现;q比比较较私私有有继继承承和和保保护护继继承承,可可以以看看出出在在直直接接派派生生类类中中两两者者的的效效果果实实际际上上都都相相同同,但但如如果果再再继继续续派派生下去就会出现区别;生下去就会出现区别;3.2 继承方式继承方式2024/5/25 周六15q假假设设有有A A-B-B-C C这这样样一一个

13、个继继承承顺顺序序如如果果B B私私有有继继承承A A后后又又派派生生出出C C那那么么C C就就无无法法再再间间接接继继承承A A的的成成员员对对A A功能的继承在功能的继承在B B那儿就终止了;那儿就终止了;q而而如如果果B B保保护护继继承承A A后后又又派派生生出出C C那那么么A A中中的的公公有有和和保保护护成成员员在在B B中中都都是是保保护护成成员员因因此此A A的的功功能能可可以以被被C C间接继承;间接继承;q在实际开发时选择在实际开发时选择恰当的恰当的继承方式;继承方式;3.2 继承方式继承方式2024/5/25 周六163.2 继承方式继承方式3.2.43.2.4多继承

14、多继承(多个父类多个父类):):q 声明声明多继承多继承的语法如下的语法如下:class class :,1,2,q多继承举例:在公司员工管理中多继承举例:在公司员工管理中q有时会存在多继承关系,如图:有时会存在多继承关系,如图:经理经理销售部经理销售部经理销售人员销售人员2024/5/25 周六173.3 派生类的构造函数和析构函数派生类的构造函数和析构函数3.3.13.3.1构造函数:构造函数:q 在在创创建建派派生生类类的的对对象象时时,系系统统执执行行派派生生类类的的构构造造函数而不会自动执行基类的构造函数;函数而不会自动执行基类的构造函数;q 在在设设计计派派生生类类的的构构造造函函

15、数数时时,不不仅仅要要为为初初始始化化派派生生类类新新增增加加的的数数据据提提供供参参数数,而而且且还还应应为为初初始始化化基类数据成员提供参数基类数据成员提供参数q相关语法:相关语法:():()()2)2024/5/25 周六183.3 派生类的构造函数和析构函数派生类的构造函数和析构函数q派派生生类类构构造造函函数数的的调调用用顺顺序序为为先先父父辈辈(基基类类数数据据)后自己后自己(派生类新数据派生类新数据);q轿轿车车具具有有交交通通工工具具的的一一般般特特征征,比比如如轮轮胎胎数数目目,同同时时又又具具有有轿轿车车自自身身的的特特征征,如如载载客客人人数数,因因此此轿车继承交通工具,

16、成为它的一个派生类。轿车继承交通工具,成为它的一个派生类。q例例3.4 3.4 派生类构造函数举例派生类构造函数举例:sclass3_4.h smain3_4.cpp 2024/5/25 周六193.3 派生类的构造函数和析构函数派生类的构造函数和析构函数q派生类派生类必须定义必须定义构造函数的两种情况:构造函数的两种情况:派派生生类类新新增增的的数数据据成成员员需需要要定定义义构构造造函函数数来来为为其初始化;其初始化;基基类类定定义义了了带带参参数数的的构构造造函函数数需需要要派派生生类类为为其其提供参数以完成基类数据成员的初始化。提供参数以完成基类数据成员的初始化。2024/5/25 周

17、六203.3 派生类的构造函数和析构函数派生类的构造函数和析构函数3.3.23.3.2析构函数析构函数 q当当派派生生类类对对象象消消亡亡时时,系系统统会会自自动动调调用用派派生生类类的析构函数做一些必要的清理工作;的析构函数做一些必要的清理工作;q由由于于在在继继承承过过程程中中派派生生类类不不能能继继承承基基类类的的析析构构函函数数,所所以以如如果果需需要要就就只只能能在在派派生生类类中中重重新新定定义;义;2024/5/25 周六21q在在执执行行派派生生类类的的析析构构函函数数时时基基类类的的析析构构函函数数也也将将被自动调用;被自动调用;q析析构构函函数数调调用用的的顺顺序序是是先先

18、派派生生类类的的析析构构函函数数,然然后是基类的析构函数。后是基类的析构函数。q例例3.5 3.5 派生类析构函数举例派生类析构函数举例:sclass3_5.h smain3_5.cpp 3.3 派生类的构造函数和析构函数派生类的构造函数和析构函数调用类调用类A的构造函数的构造函数调用类调用类B的构造函数的构造函数调用类调用类B的析构函数的析构函数调用类调用类A的析构函数的析构函数2024/5/25 周六223.4 虚基类虚基类3.4.13.4.1声明一个虚基类声明一个虚基类 q 多继承中的多义性多继承中的多义性 2024/5/25 周六232.2.作用域分辨符作用域分辨符 可以可以通过作用域

19、分辨符明确指定调用哪个类的通过作用域分辨符明确指定调用哪个类的接口;接口;其语法形式如下其语法形式如下 :.:/访访问问数据成员数据成员 .:/访问成员函数访问成员函数3.4 虚基类虚基类2024/5/25 周六24q作用域分辨符举例作用域分辨符举例:Smain3_5_B.cppSmain3_5_B.cppq基基类类可可以以将将其其设设为为虚虚基基类类,这这样样它它的的数数据据成成员员在在内内存存中中就就只只有有一一个个副副本本,成成员员函函数数也也只只有有一一个个映映射从而解决了同名成员的唯一标识问题;射从而解决了同名成员的唯一标识问题;3.4 虚基类虚基类2024/5/25 周六253.3

20、.虚基类虚基类q由由virtualvirtual标识,声明语法如下:标识,声明语法如下:classclass:virtualvirtual ;q例例3.6 3.6 虚基类举例虚基类举例:sclass3_6.h smain3_6.cpp l考虑员工管理系统中的多继承关系考虑员工管理系统中的多继承关系q使用虚基类来定义公司员工管理系统中的多继承使用虚基类来定义公司员工管理系统中的多继承关系:关系:3.4 虚基类虚基类2024/5/25 周六26/在继承路径在继承路径“销售经理销售经理销售人员销售人员员工员工”中中将基类将基类CCompanyStaff设为虚基类设为虚基类class CSaleman

21、:virtual public CCompanyStaff;/在继承路径在继承路径“销售经理销售经理经理经理员工员工”中将基中将基类类CCompanyStaff设为虚基类设为虚基类class CManager:virtual public CCompanyStaff;/派生类派生类CSaleManager成为两条继承路径的交汇点成为两条继承路径的交汇点class CSaleManager:public CSaleman,public Cmanager;3.4 虚基类虚基类2024/5/25 周六27q比较使用作用域分辨符和虚基类技术比较使用作用域分辨符和虚基类技术 :使使用用作作用用域域分分辨

22、辨符符时时基基类类的的成成员员在在内内存存中中存存在在多多个个副副本本,通通过过指指定定基基类类名名来来唯唯一一标标识识使使用用的的是是哪哪个个副副本本,这这样样可可以以存存放放不不同同的的数数据据进进行行不不同同的的操操作;作;使使用用虚虚基基类类技技术术使使基基类类的的成成员员在在内内存存中中只只存存有有一一个副本个副本;3.4 虚基类虚基类2024/5/25 周六283.4.23.4.2虚基类的初始化:虚基类的初始化:虚虚基基类类的的初初始始化化在在语语法法上上和和处处理理一一般般基基类类一一样样只是只是调用顺序略有不同调用顺序略有不同它遵循以下顺序:它遵循以下顺序:1 1)虚基类虚基类

23、的构造函数在非虚基类之前调用;的构造函数在非虚基类之前调用;2 2)若若同同一一层层次次中中包包含含多多个个虚虚基基类类则则按按它它们们的的声声明顺序明顺序调用;调用;3 3)若若虚虚基基类类由由非非虚虚基基类类派派生生而而来来要要先先调调用用更更高高级别基类级别基类的构造函数再遵循上述的构造函数再遵循上述1 1和和2 2的顺序。的顺序。3.4 虚基类虚基类2024/5/25 周六29q虚基类初始化顺序的简单举例:虚基类初始化顺序的简单举例:class A;class A;class B;class B;class C:class C:public A,virtualpublic A,virt

24、ual B B ;将产生如下的调用次序将产生如下的调用次序 B()B()A()A()C()C()3.4 虚基类虚基类2024/5/25 周六30q 较复杂的虚基类初始化举例:较复杂的虚基类初始化举例:3.4 虚基类虚基类2024/5/25 周六31q为了避免在不同继承路径中继承来的同一成员发为了避免在不同继承路径中继承来的同一成员发生多个副本的冲突可以将相应的基类设为虚基类,生多个副本的冲突可以将相应的基类设为虚基类,见见源代码源代码:sclass3_7.h smain3_7.cpp 运行结果运行结果:class Base1class Base2class Level2class Base2c

25、lass Level1class Leaf3.4 虚基类虚基类2024/5/25 周六323.5 聚合类聚合类3.5.13.5.1聚合类的概念聚合类的概念 q设设计计孤孤立立的的类类是是较较容容易易的的,难难的的是是正正确确设设计计基基类类及及其派生类;其派生类;q一一般般地地如如果果在在逻逻辑辑上上A A 是是B B 的的一一部部分分而而A A与与B B又又不不属属于于同同一一类类范范畴畴,则则不不允允许许B B继继承承A A的的功功能能而而是是要要用用A A和其它东西和其它东西组合出组合出B B;q聚聚合合(aggregation)aggregation)也也是是实实现现程程序序代代码码重

26、重用用的的另另一一有效手段有效手段 ;q类类的的聚聚合合,就就是是指指在在一一个个类类中中内内嵌嵌其其他他类类的的对对象象作作为成员为成员的现象;的现象;q“拥有拥有”(”(has a)has a)关系关系,聚合类拥有内嵌对象聚合类拥有内嵌对象 ;q出出于于信信息息隐隐藏藏的的考考虑虑,常常将将其其访访问问权权限限设设为为“私私有有”。2024/5/25 周六333.5.23.5.2聚合类中的构造函数聚合类中的构造函数q聚聚合合类类对对象象在在创创建建时时作作为为其其组组成成部部件件的的内内嵌嵌对对象象将首先被系统创建;将首先被系统创建;q如如果果一一个个聚聚合合类类,同同时时又又是是一一个个

27、派派生生类类,那那么么它它的的构构造造函函数数初初始始化化列列表表还还应应负负责责为为基基类类构构造造函函数数的调用提供参数;的调用提供参数;q当当一一个个类类既既是是聚聚合合类类又又是是派派生生类类时时的的构构造造函函数数定定义形式:义形式::类的初始化类的初始化 3.5 聚合类聚合类2024/5/25 周六34例例3.8 3.8 公司的每一个员工都拥有不同的教育背景,其公司的每一个员工都拥有不同的教育背景,其中记录着毕业学校、最高学历等基本数据。可以将教育背景中记录着毕业学校、最高学历等基本数据。可以将教育背景抽象为一个类抽象为一个类CEducation,拥有上述数据,并提供查询数据,拥有

28、上述数据,并提供查询数据和显示数据等基本功能。企业员工类和显示数据等基本功能。企业员工类CCompanyStaff要使用要使用教育背景类教育背景类CEducation的功能,但是前者不能继承后者所具的功能,但是前者不能继承后者所具有的特征,因此可以把有的特征,因此可以把CCompanyStaff类处理成一个聚合类,类处理成一个聚合类,在类中内嵌一个在类中内嵌一个Ceducation类的对象。类的对象。q员工管理系统中的聚合关系:员工管理系统中的聚合关系:sclass3_8_companyStaff.h sclass3_8_companyStaff.cpp smain3_8.cpp 3.5 聚合

29、类聚合类2024/5/25 周六353.6 继承应用实例继承应用实例2.6.1问题描述:问题描述:q该该公公司司的的员员工工组组成成很很简简单单,主主要要分分成成经经理理,销销售售部门经理,销售人员和行政人员等几类;部门经理,销售人员和行政人员等几类;q所所有有员员工工都都具具有有姓姓名名,工工作作编编号号,基基本本工工资资,奖奖金金,当当月月出出勤勤记记录录等等数数据据,都都拥拥有有一一定定的的教教育育背背景;景;q每每个个员员工工都都存存在在录录入入和和显显示示信信息息等等操操作作,并并且且需需要根据考勤等实际因素来发放工资;要根据考勤等实际因素来发放工资;q不同类别的员工计算工资的办法也各不相同;不同类别的员工计算工资的办法也各不相同;例例3.9 3.9 公司员工管理系统公司员工管理系统 ,源程序源程序:sclass3_9_companyStaff.h sclass3_9_companyStaff.cpp smain3_9.cpp2024/5/25 周六36习题习题课后习题、作业课后习题、作业习题习题1习题习题2习题习题32024/5/25 周六37Thanks!Thanks!2024/5/25 周六38

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服