您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > C++程序设计教程10
06:21:121C++程序设计教程(第二版)第十章继承Chapter10Inheritance苏州大学计算机科学与技术学院06:21:122第十章内容1.继承结构(InheritanceStructure)2.访问父类成员(AccessFather’sMember)3.派生类的构造(ConstructingDerivedClasses)4.继承方式(InheritanceMode)5.继承与组合(Inheritance&Composition)6.多继承概念(Multi-InheritanceConcept)7.多继承技术(Multi-InheritanceTechnology)06:21:12310.1继承结构10.1.1类层次结构1.宇宙万事万物都是分类分层的,解决问题可以从事物之间的上下关系中着手.这是继承引入程序设计的前提.2.交通工具的类层次结构分析3.继承是一个派生类在直接拥有基类全部资源的基础上,进行修改和增加的代码高度可重用的一个过程4.相关概念:基类和父类子类和派生类06:21:124对于下面的继承关系:classFather{inta,b;public://成员函数};classSon:publicFather{intc;public://成员函数};10.1.2派生类对象结构基类对象子类对象abcab基类部分子类添加部分10.1继承结构06:21:12510.1继承结构1.派生类总是依附于基类,派生类对象中总是含有基类的成员;基类对象总是派生类对象的组成部分2.在具体程序实现中,派生类对象中基类部分成员的空间安排并不一定是基类在前,派生类在后3.派生类对象一定比基类对象大06:21:12610.2访问父类成员10.2.1继承父类成员1.派生类可以继承基类的所有成员Public成员Private成员Protected成员2.继承关系中派生类拥有基类成员的程序举例(f1001)3.继承的高度代码重用机制和非继承的代码简单复制重用机制的效果对比4.派生类对象可以在需要的场合下被理解为是基类对象GraduateStudentgs;Students(gs);Student&t=gs;Student*t=&gs;06:21:12710.2.2类内访问控制1.继承权限2.继承后基类部分成员在派生类的内部和外部的不同作用权限3.private基类成员在派生类中是不能直接访问的4.protected基类成员在派生类中是可以直接访问的5.public基类成员在派生类中时可以直接访问的6.代码分析(p333)7.protected成员在继承过程中所发挥的重要角色:为了扩展临时功能8.基类为了长远考虑,可以留下保护成员。但规范情况下派生类仅使用公共成员,而不使用任何保护成员10.2访问父类成员06:21:12810.3派生类的构造10.3.1默认构造•如果子类没有构造函数,则调用默认构造函数,默认构造函数转而先调用父类的无参构造函数,完成父类对象部分的构造.•如果父类的上面还有父类,则依次递归.•基类部分和子类部分成员初始化时的各司其职10.3.2自定义构造•基类无参构造方式的功能缺陷•可以在子类构造函数中指定基类部分的构造方式(冒号语法)•程序举例(f1002)•子类和基类中成员的同名现象及域分辨符::06:21:129classStudent{public:voiddisplay();//...};classGraStudent:publicStudent{public:voiddisplay()//overlap{Student::display()...}//...};voidfn(){GraStudentgs;gs.display();}10.3派生类的构造06:21:121010.3.3拷贝构造与赋值•子类若没有定义拷贝构造函数,则子类对象在拷贝创建时先调用父类的拷贝构造函数,再完成自己的位对位拷贝.•父类若没有定义拷贝构造函数,则子类对象在拷贝创建中调用父类默认的拷贝构造函数.•赋值操作符原理相似10.3.4对象构造顺序•申请基类部分成员的空间。根据有无初始化列表的条件调用基类构造函数。•申请类成员对象空间,根据有无初始化列表的条件按照声明顺序调用相应的构造函数•最终执行自己的构造函数函数体•析构函数的执行顺序相反10.3派生类的构造06:21:121110.4继承方式10.4.1继承访问控制1.三种继承权限2.不同继承权限下基类的不同成员在继承后的派生类中的权限表现3.程序举例(f1003)10.4.2调整访问控制1.在派生类中对于可见的成员可以调整访问控制属性2.程序举例(f1004)3.成员权限总结06:21:121210.5继承与组合10.5.1对象结构1.组合:类中含有对象成员,称为组合式包含2.继承:子类继承了父类,称为子类对象对父类对象的继承式包含3.继承和组合都重用了类设计.继承部分派生部分其他数据成员Student对象Advisor对象研究生对象组合式包含继承式包含06:21:121310.5继承与组合10.5.2继承和组合的性质差异1.继承和组合在物理结构上都是包含关系,但在性质上完全不同2.继承关系中子类和基类的性质是相同的,属于同类。而且子类可以直接访问基类中的非private成员3.组合关系中类对象和成员对象的性质是不同的,彼此之间独立。成员对象的任何数据都必须通过成员对象的操作去间接访问06:21:121410.5继承与组合10.5.3对象分析10.5.4继承设计10.5.5组合设计1.继承完全可以用组合来实现,组合也完全可以用继承来实现2.继承在访问基类成员上比较方便和直接,但基类和子类是紧密结合在一起的,调试过程比较繁琐3.组合在访问成员对象数据时比较麻烦,但调试比较直截了当4.继承和组合的选用5.无论选用继承还是组合,对外接口都是相同的。这一点是宗旨。06:21:1215继承型的Circle类头文件:#includepoint.hclassCircle:publicPoint{doubleradius;public://成员函数};组合型的Circle类头文件:#includepoint.hclassCircle{Pointpoint;doubleradius;public://成员函数};公有成员函数实现不同,但可以让界面相同,从而不影响编程者使用继承与组合在于实现技术不同10.5继承与组合06:21:121610.6多继承概念10.6.1多继承结构1.以多个已定义的类为基类,通过继承产生派生类的过程称为多重继承2.程序举例(f1006)10.6.2基类成员名冲突1.问题的提出2.简单解决方法及其缺点3.问题的关键原因所在:多个基类中出现两个或多个意义相同的实体是不应该的06:21:121710.6多继承概念10.6.3基类分解1.程序举例(f1007)06:21:121810.7多继承技术10.7.1虚拟继承1.虚拟继承的概念2.程序举例(f1008)3.虚拟继承后的对象内存分布格局06:21:121910.7多继承技术10.7.2多继承对象的构造顺序1.基于多重继承产生的子类中可能需要构造的成分子类自身的直接成员普通成员类成员虚拟继承的基类部分普通继承的基类部分2.多重继承构造顺序举例3.多重继承构造顺序的规则
本文标题:C++程序设计教程10
链接地址:https://www.777doc.com/doc-3163645 .html