已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章派生新类 28 03 2020 1 4 3 4派生类构造函数和析构函数 通过前面的学习 我们知道派生类的对象自动拥有基类的所有数据成员 所以 在定义派生类的构造函数时除了对派生类的数据成员进行初始化外 还必须初始化基类的数据成员 如果派生类中有对象成员时 还要初始化对象成员 派生类构造函数的一般格式如下 其中 总参数表包含完成基类初始化所需的参数 第4章派生新类 28 03 2020 2 rectangle hclassPoint baseclass public Point floatxx 0 floatyy 0 X xx Y yy voidMove floatxOff floatyOff X xOff Y yOff floatGetX returnX floatGetY returnY private floatX Y classRectangle publicPoint derivedclass public Rectangle floatx floaty floatw floath Point x y W w H h floatGetH returnH floatGetW returnW private floatW H 第4章派生新类 28 03 2020 3 test cpp include rectangle h includeusingnamespacestd intmain Rectanglerect 2 3 20 10 rect Move 3 2 cout Thedataofrect X Y W H endl cout rect GetX rect GetY rect GetW rect GetH endl return0 Therunresultis Thedataofrect X Y W H 5 5 20 10 第4章派生新类 28 03 2020 4 注意 作为一般规则 派生类构造函数最好不要直接向一个基类数据成员赋值 而是通过初始化列表把值传递给基类的适当的构造函数 当基类中没有显式定义构造函数时 派生类构造函数的初始化列表可以省略对基类的初始化 当基类的构造函数使用一个或多个参数时 派生类必须定义构造函数 将参数传递给基类的构造函数 第4章派生新类 28 03 2020 5 classPerson public Person conststringName intAge charSex stringGetName return name intGetAge return age charGetSex return sex voidDisplay protected 保护成员intage private stringname charsex Person Person conststringName intAge charSex name Name age Age sex Sex voidPerson Display cout name name t 直接访问本类私有成员cout age age t cout sex sex endl 第4章派生新类 28 03 2020 6 classStudent publicPerson public 外部接口Student stringpName intAge charSex stringpId floatScore id pId Person pName Age Sex score Score stringGetId return id floatGetScore returnscore voidDisplay private stringid floatscore voidStudent Display cout id id t cout age age t cout score score endl 第4章派生新类 28 03 2020 7 intmain stringname cout name Personp1 name 29 m 基类对象p1 Display 基类对象访问基类公有成员函数cout name Students1 name 19 f 03410101 95 派生类对象cout name s1 GetName t 访问基类成员函数cout id s1 GetId t cout age s1 GetAge t cout sex s1 GetSex t cout score s1 GetScore endl s1 Display 同名屏蔽s1 Person Display 显式访问基类公有成员函数return0 第4章派生新类 28 03 2020 8 Student类由基类Person的成员和一个string类对象成员构成 在构建派生类对象时初始化顺序是 先是基类中的name对象成员 接着是基类的其它成员 然后是派生类中的id对象成员 最后是派生类的其它成员 尽管Person被放在初始化列表中的第二位 但总是先于id被初始化 构造函数执行顺序为 基类的构造函数 对象成员构造函数 派生类的构造函数 析构函数执行顺序刚好相反 Student类对象有两个Display 这时可以用类名加作用域运算符来限定调用哪个Display 如果不限定 则调用派生类的Display 第4章派生新类 28 03 2020 9 现在可以来解决前面提出的问题了 如图所示 但是销售经理具有经理和销售员的特征 即由两个基类派生而来 这涉及多继承 第4章派生新类 28 03 2020 10 第4章派生新类 28 03 2020 11 4 4多继承与虚拟继承 一个类可以从一个或者多个基类派生而来 根据派生类继承基类的个数 将继承分为单继承和多继承 当派生类有多个基类时称为多继承 单继承可以看作是多继承的一个特例 多继承可以看作是多个单继承的组合 它们有很多相同特性 第4章派生新类 28 03 2020 12 多继承派生类的定义 多继承派生类的定义格式如下class 与单继承一样 默认继承方式为私有继承 第4章派生新类 28 03 2020 13 多继承派生类的构造函数 多继承派生类构造函数的定义格式如下 其中 总参数表包含完成所有基类初始化所需的参数 第4章派生新类 28 03 2020 14 多继承派生类的构造函数与单继承一样 要负责所有基类的初始化工作 构造函数执行顺序是 先执行所有基类的构造函数 再执行对象成员类构造函数 最后执行派生类的构造函数 处于同一层次的各基类构造函数的执行顺序取决于定义派生类时所指定的基类顺序 与派生类构造函数中所定义的成员初始化列表顺序无关 析构函数执行顺序与构造函数的执行顺序相反 第4章派生新类 28 03 2020 15 示例多继承构造函数和析构函数执行顺序classA 定义基类A public A inti a i cout AConstructor endl voiddisp cout a a endl A cout ADestructor endl private inta classB 定义基类B public B intj b j cout BConstructor endl voiddisp cout b b endl B cout BDestructor endl private intb 第4章派生新类 28 03 2020 16 classC publicB publicA 定义派生类C B在前 A在后 public C intk A k 2 B k 2 包含基类成员初始化列表 c k cout CConstructor endl voiddisp A disp 用类名加作用域运算符限定B disp cout c c endl C cout CDestructor endl private intc intmain Cobj 10 obj disp 调用类C的成员函数dispreturn0 第4章派生新类 28 03 2020 17 提出问题 在现实问题中 存在这样的情况 那么C类从B1和B2类继承下来两份A类的成员 在使用时出现二义性 如何解决 第4章派生新类 28 03 2020 18 第4章派生新类 28 03 2020 19 解决方案一 用作用域运算符 进行限定 显式访问基类成员 例如 派生类C的对象访问基类的disp函数时用 A disp 和 B disp 显式访问 第4章派生新类 28 03 2020 20 解决方案二 为避免对基类成员访问的二义性问题 可以将派生类的直接基类 如Salesman Manager 的共同基类 如Employee 设置为虚基类 这样共同基类 Employee 在内存中只有一个副本存在 即将Employee类设为虚基类 第4章派生新类 28 03 2020 21 虚基类 虚基类的定义格式为 class virtual 注 引进虚基类后 派生类对象中只存在一个虚基类成员的副本 第4章派生新类 28 03 2020 22 示例虚基类classA public A a 10 protected inta classA1 virtualpublicA 定义虚基类public A1 cout a endl classA2 virtualpublicA 定义虚基类public A2 cout a endl classB A1 A2 私有继承public B cout a endl intmain Bobj return0 第4章派生新类 28 03 2020 23 示例虚基类 分析构造函数的调用顺序classBase1 public Base1 cout classBase1 endl classBase2 public Base2 cout classBase2 endl classLevel1 publicBase2 virtualpublicBase1 定义虚基类public Level1 cout classLevel1 endl classLevel2 publicBase2 virtualpublicBase1 public Level2 cout classLevel2 endl classTopLevel publicLevel1 virtualpublicLevel2 public TopLevel cout classTopLevel endl voidmain TopLevelobj return0 第4章派生新类 28 03 2020 24 第4章派生新类 28 03 2020 25 构造函数的执行顺序 虚基类
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 签了退款保密协议书
- 130航空服务客舱安全与应急处理技能考核试卷
- 字母圈ds协议书
- rcep服务贸易协议书
- 2025年农业文化遗产保护与利用技术考核试卷
- 2025年道路运输企业安全生产应急物资管理制度内容考核试卷
- 2025年零售行业智能零售模式创新与消费者体验研究报告及未来发展趋势预测
- 2025年节能环保行业绿色环保技术应用分析报告
- 2025年媒体传播行业数字化转型与用户体验研究报告及未来发展趋势预测
- 2025年互联网与信息技术行业准入考试人工智能算法伦理评估-司法量刑辅助AI的算法更新与伦理一致性考核试卷
- 护士职业生涯发展规划
- GB/T 6109.11-2025漆包圆绕组线第11部分:155级聚酰胺复合直焊聚氨酯漆包铜圆线
- 2025年语文高考北京试卷及答案
- 二十届四中全会测试题及答案单选题(20题)
- 2025重庆双福农产品批发市场有限公司招聘综合办公室文员、冻库管理员、招商员等岗位22人备考考试试题及答案解析
- 气弹簧力学计算器
- 专利产品体验报告
- 毕业论文机械手夹持器设计
- 医疗护理服务管理之优质护理服务培训PPT
- 系统熟悉级航机务培训中心
- 高处作业施工安全专项施工方案
评论
0/150
提交评论