钱能C++程序设计教程10.ppt_第1页
钱能C++程序设计教程10.ppt_第2页
钱能C++程序设计教程10.ppt_第3页
钱能C++程序设计教程10.ppt_第4页
钱能C++程序设计教程10.ppt_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

6/6/2020,1,C+程序设计教程(第二版),第十章继承Chapter10Inheritance,清华大学出版社钱能,6/6/2020,2,第十章内容,继承结构(InheritanceStructure)访问父类成员(AccessFathersMember)派生类的构造(ConstructingDerivedClasses)继承方式(InheritanceMode)继承与组合(Inheritancepublic:/成员函数;classSon:publicFatherintc;public:/成员函数;,基类对象子类对象子类对象空间总是不小于基类对象,c,a,b,a,b,基类部分,子类添加部分,6/6/2020,5,2.访问父类成员(AccessFathersMember),捆绑子类对象可以访问父类成员函数和自身成员函数;捆绑基类对象只能访问基类成员函数,不能访问子类成员函数,这是自然的:Studentds(“Jenny);GraduateStudentgs(“Smith”);ds.addCourse(3,2.5);ds.display();gs.addCourse(3,3.0);gs.display();gs.getQualifier();ds.getQualifier();/error,6/6/2020,6,子类也是基类的用户,其成员函数不能访问基类的私有成员但子类可以区别于外来用户,让基类protected成员允许子类对象访问而不许外来对象访问.例如,对于基类:classFatherinta;protected:voidfp()couta;public:voidprint()couta;,外来用户:voidfn()Sond;d.print();/okd.disp();/okd.fp();/errorFatherf;f.print();/okf.fp();/error,子类用户:classSon:publicFatherintb;public:voiddisp()fp();/okprint();/okvoided()a+;/error;,6/6/2020,7,3.构造子类对象(ConstructingObjectsofSubClass),默认构造:如果子类没有构造函数,则调用默认构造函数,默认构造函数转而先调用默认父类构造函数,完成父类对象部分的构造如果父类的上面还有父类,则依次递归,6/6/2020,8,自定义构造:为了规定父类构造函数的调用方式而不是默认调用,需要自定义子类构造函数,并且,在构造函数定义体的初始化列表中描述父类构造函数的调用形式描述形式与对象成员构造的描述一致GraduateStudent(conststring/.;classGraStudent:publicStudentpublic:voiddisplay();/overlap/.;voidfn()GraStudentgs;gs.display();/callGraStudent:display()捆绑子类对象访问成员函数,则首先匹配子类,然后父类,再父类的父类,依此类推,6/6/2020,10,拷贝构造:子类若没有定义拷贝构造函数,则子类对象在拷贝创建时先调用父类的拷贝构造函数,再完成自己的位对位拷贝父类若没有定义拷贝构造函数,则子类对象在拷贝创建中调用父类默认的拷贝构造函数赋值操作符原理相似,6/6/2020,11,4.继承方式(InheritanceMode),继承可以公有继承,保护继承和私有继承公有继承是普通继承,基类可以为大多数应用服务也可以重复继承保护继承是“单传”继承,只继承给自己的后代,应用是以子孙的公有成员函数来对外展开服务的私有继承是“绝版”继承,该基类只继承直接的子类,而不考虑让子类再继承下去,6/6/2020,12,继承体系中,子类可以在祖先类成员可见的范围中调整其访问控制属性classAinta1;public:inta2;classB:privateApublic:usingA:a2;/a2从私有转为公有usingA:a1;/错:a1不可见;intmain()Bd;d.a2=1;/ok,6/6/2020,13,5.继承与组合(Inheritancepublic:/成员函数;,组合型的Circle类头文件:#includepoint.hclassCirclePointpoint;doubleradius;public:/成员函数;,公有成员函数实现不同,但可以让界面相同,从而不影响编程者使用,继承与组合在于实现技术不同,6/6/2020,15,使用含有继承和组合的子类:只要外界不直接或无法直接使用该子类的祖先类成员或对象成员,仅提供公有的成员函数,则对外界来说,无所谓该子类的继承式包含还是组合式包含(包含组合或继承的哪种头文件都可):#include”point.h”#include“circle.h”/组合或继承intfn()Circlec(Point(2.3,5.6),7);c.moveTo(1,2);c.modifyRadius(3);/,6/6/2020,16,6.多继承概念(Multi-InheritanceConcept),多继承:一个实体,来自多个类对象的组合因而它同时也可以继承多个基类来实现,6/6/2020,17,多继承的主要技术问题:由于子类可以访问多个基类,而基类之间没有专门的协调,所以,基类可能出现相同的名字,这于子类来说,要访问这种名字增加了编程的复杂性,不得不要在名字前加上前缀然而,这种同名也许意义相同,操作这种名字本身便是一种分别性操作,不合逻辑于是便寻求一种分离共性,统一基类的解决办法(见CH12.5).但是,不同的父类拥有共性基类,访问基类成员仍然存在相同名字冲突问题,6/6/2020,18,7.多继承技术(Multi-InheritanceTechnology),解决多继承基类名字冲突问题将多个父类看成同一基类下的不同子类,而所需要派生的子类来自于这些不同子类于是形成一个棱形结构,Bed,sleep(),Sofa,watchTV(),SleeperSofa,FoldOut(),Furnitureweight,getWeight(),setWeight(),6/6/2020,19,多个不同子类(如,床、沙发)在继承基类的方式上采取虚拟继承,它的作用是,当对象创建上产生基类重叠时,略去重复产生基类对象空间的行为:classBed:virtual

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论