《C++程序设计教程10.ppt》由会员分享,可在线阅读,更多相关《C++程序设计教程10.ppt(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、C+程序设计教程(第二版)第十章 继承 Chapter 10 Inheritance 清华大学出版社 钱 能1/15/20231第十章内容1.继承结构继承结构(Inheritance Structure)2.访问父类成员访问父类成员(Access Fathers Member)3.派生类的构造派生类的构造(Constructing Derived Classes)4.继承方式继承方式(Inheritance Mode)5.继承与组合继承与组合(Inheritance&Composition)6.多继承概念多继承概念(Multi-Inheritance Concept)7.多继承技术多继承技术(
2、Multi-Inheritance Technology)1/15/202321.继承结构继承结构(Inheritance Structure)宇宙万事万物都是分类分层的,解决问题可以从事物之间的上下关系中着手这是继承引入程序设计的前提例如:已知鸟的属性,鸭子是什么的描述便可以在鸟的基础上进行:除了是鸟之外,还会一种区别于其他鸟的特殊的嘎嘎叫 因为鸭子不会飞,于是就在继承鸟的属性中去掉会飞的属性1/15/20233派生类对象结构派生类对象结构 对于下面的继承关系:对于下面的继承关系:class Father int a,b;public:/成员函数;class Son:public Fathe
3、r int c;public:/成员函数;基类对象子类对象子类对象空间总是不小于基类对象cabab基类部分子类添加部分1/15/202342.访问父类成员访问父类成员(Access Fathers Member)捆绑子类对象可以访问父类成员函数和自身成员函数;捆绑基类对象只能访问基类成员函数,不能访问子类成员函数,这是自然的:Student ds(“Jenny);GraduateStudent gs(“Smith”);ds.addCourse(3,2.5);ds.display();gs.addCourse(3,3.0);gs.display();gs.getQualifier();ds.ge
4、tQualifier();/error1/15/20235子类也是基类的用户,其成员函数不能访问基类的私有成员但子类可以区别于外来用户,让基类protected成员允许子类对象访问而不许外来对象访问.例如,对于基类:class Father int a;protected:void fp()couta;public:void print()couta;外来用户:外来用户:void fn()Son d;d.print();/ok d.disp();/ok d.fp();/error Father f;f.print();/ok f.fp();/error子类用户:子类用户:class Son:p
5、ublic Father int b;public:void disp()fp();/ok print();/ok void ed()a+;/error;1/15/202363.构造子类对象构造子类对象(Constructing Objects of SubClass)默认构造:如果子类没有构造函数,则调用默认构造函数,默认构造函数转而先调用默认父类构造函数,完成父类对象部分的构造如果父类的上面还有父类,则依次递归1/15/20237自定义构造:为了规定父类构造函数的调用方式而不是默认调用,需要自定义子类构造函数,并且,在构造函数定义体的初始化列表中描述父类构造函数的调用形式描述形式与对象成员
6、构造的描述一致GraduateStudent(const string&pN,Advisor&adv):Student(pN),advisor(adv),qualifierGrade(0)1/15/20238覆盖(overlap):子类定义了与祖先类(父类,或者父类的父类.)名字相同的成员class Studentpublic:void display();/.;class GraStudent:public Studentpublic:void display();/overlap /.;void fn()GraStudent gs;gs.display();/call GraStudent
7、:display()捆绑子类对象访问成员函数,则首先匹配子类,然后父类,再父类的父类,依此类推1/15/20239拷贝构造:子类若没有定义拷贝构造函数,则子类对象在拷贝创建时先调用父类的拷贝构造函数,再完成自己的位对位拷贝父类若没有定义拷贝构造函数,则子类对象在拷贝创建中调用父类默认的拷贝构造函数赋值操作符原理相似1/15/2023104.继承方式继承方式(Inheritance Mode)继承可以公有继承,保护继承和私有继承公有继承是普通继承,基类可以为大多数应用服务也可以重复继承保护继承是“单传”继承,只继承给自己的后代,应用是以子孙的公有成员函数来对外展开服务的私有继承是“绝版”继承,该
8、基类只继承直接的子类,而不考虑让子类再继承下去1/15/202311继承体系中,子类可以在祖先类成员可见的范围中调整其访问控制属性class A int a1;public:int a2;class B:private Apublic:using A:a2;/a2从私有转为公有 using A:a1;/错:a1不可见;int main()B d;d.a2=1;/ok1/15/2023125.继承与组合继承与组合(Inheritance&Composition)组合:类中含有对象成员,称为组合式包含继承:子类继承了父类,称为子类对象对父类对象的继承式包含继承和组合都重用了类设计继承重用场合,父类
9、对象就在自己家里,无须捆绑父类对象便能对其操作但是操作受到了父类访问控制属性设定的制约组合重用场合,使用对象成员的操作需捆绑对象成员,而且只能使用对象的公有成员继承部分派生部分其他数据成员Student对象Advisor对象研究生对象组合式包含继承式包含1/15/202313继承型的Circle类头文件:#includepoint.hclass Circle:public Point double radius;public:/成员函数;组合型的Circle类头文件:#includepoint.hclass Circle Point point;double radius;public:/成员
10、函数;公有成员函数实现不同,但可以让界面相同,从而不影响编程者使用继承与组合在于实现技术不同1/15/202314使用含有继承和组合的子类:只要外界不直接或无法直接使用该子类的祖先类成员或对象成员,仅提供公有的成员函数,则对外界来说,无所谓该子类的继承式包含还是组合式包含(包含组合或继承的哪种头文件都可):#include”point.h”#include“circle.h”/组合或继承int fn()Circle c(Point(2.3,5.6),7);c.moveTo(1,2);c.modifyRadius(3);/1/15/2023156.多继承概念多继承概念(Multi-Inherit
11、ance Concept)多继承:一个实体,来自多个类对象的组合因而它同时也可以继承多个基类来实现1/15/202316多继承的主要技术问题:由由于于子子类类可可以以访访问问多多个个基基类类,而而基基类类之之间间没没有有专专门门的的协协调调,所所以以,基基类类可可能能出出现现相相同同的的名名字字,这这于于子子类类来来说说,要要访访问问这这种种名名字字增增加加了了编编程程的的复复杂杂性性,不不得得不不要要在在名字前加上前缀名字前加上前缀然而,这种同名也许意义相同,操作这种名然而,这种同名也许意义相同,操作这种名字本身便是一种分别性操作,不合逻辑字本身便是一种分别性操作,不合逻辑于是便寻求一种分离
12、共性,统一基类的解决于是便寻求一种分离共性,统一基类的解决办法办法(见见CH12.5).但是,不同的父类拥有共性基类,访问基类但是,不同的父类拥有共性基类,访问基类成员仍然存在相同名字冲突问题成员仍然存在相同名字冲突问题1/15/2023177.多继承技术多继承技术(Multi-Inheritance Technology)解决多继承基类名字冲突问题将多个父类看成同一基类下的不同子类,而所需要派生的子类来自于这些不同子类于是形成一个棱形结构Bed sleep()Sofa watchTV()SleeperSofa FoldOut()Furniture weightgetWeight()setWeight()1/15/202318多个不同子类(如,床、沙发)在继承基类的方式上采取虚拟继承,它的作用是,当对象创建上产生基类重叠时,略去重复产生基类对象空间的行为:class Bed:virtual public Furniture public:void sleep()const coutSleeping.n;多继承这种性质的子类:class SleeperSofa:public Bed,public Sofa public:void foldOut()constcoutFoldout.n;1/15/202319