收藏 分享(赏)

钱能C++程序设计教程10.ppt

上传人:jinchen 文档编号:4895101 上传时间:2019-01-20 格式:PPT 页数:19 大小:50.50KB
下载 相关 举报
钱能C++程序设计教程10.ppt_第1页
第1页 / 共19页
钱能C++程序设计教程10.ppt_第2页
第2页 / 共19页
钱能C++程序设计教程10.ppt_第3页
第3页 / 共19页
钱能C++程序设计教程10.ppt_第4页
第4页 / 共19页
钱能C++程序设计教程10.ppt_第5页
第5页 / 共19页
点击查看更多>>
资源描述

1、1/20/2019,1,C+程序设计教程(第二版),第十章 继承 Chapter 10 Inheritance,清华大学出版社 钱 能,1/20/2019,2,第十章内容,继承结构 ( Inheritance Structure ) 访问父类成员 ( Access Fathers Member ) 派生类的构造 ( Constructing Derived Classes ) 继承方式 ( Inheritance Mode ) 继承与组合 ( Inheritance & Composition ) 多继承概念 ( Multi-Inheritance Concept ) 多继承技术 ( Mult

2、i-Inheritance Technology ),1/20/2019,3,1. 继承结构 ( Inheritance Structure ),宇宙万事万物都是分类分层的,解决问题可以从事物之间的上下关系中着手这是继承引入程序设计的前提例如:已知鸟的属性,鸭子是什么的描述便可以在鸟的基础上进行:除了是鸟之外,还会一种区别于其他鸟的特殊的嘎嘎叫因为鸭子不会飞,于是就在继承鸟的属性中去掉会飞的属性,1/20/2019,4,派生类对象结构,对于下面的继承关系:class Fatherint a,b; public:/ 成员函数 ;class Son:public Fatherint c; publ

3、ic:/ 成员函数 ;,基类对象子类对象子类对象空间总是不小于基类对象,c,a,b,a,b,基类部分,子类添加部分,1/20/2019,5,2. 访问父类成员 ( 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();d

4、s.getQualifier(); / error,1/20/2019,6,子类也是基类的用户,其成员函数不能访问基类的私有成员 但子类可以区别于外来用户,让基类protected成员允许子类对象访问而不许外来对象访问. 例如,对于基类:class Fatherint a;protected:void fp() couta; public:void print() couta; ;,外来用户: void fn()Son d;d.print(); / okd.disp(); / okd.fp(); / errorFather f; f.print(); / okf.fp(); / error ,

5、子类用户: class Son : public Fatherint b; public:void disp() fp(); / okprint(); / okvoid ed()a+; / error ;,1/20/2019,7,3.构造子类对象 ( Constructing Objects of SubClass ),默认构造: 如果子类没有构造函数,则调用默认构造函数,默认构造函数转而先调用默认父类构造函数,完成父类对象部分的构造 如果父类的上面还有父类,则依次递归,1/20/2019,8,自定义构造: 为了规定父类构造函数的调用方式而不是默认调用,需要自定义子类构造函数,并且,在构造函数

6、定义体的初始化列表中描述父类构造函数的调用形式 描述形式与对象成员构造的描述一致 GraduateStudent ( const string& pN, Advisor& adv ) : Student(pN), advisor(adv), qualifierGrade(0) ,1/20/2019,9,覆盖(overlap): 子类定义了与祖先类(父类,或者父类的父类.)名字相同的成员 class Student public: void display(); / . ; class GraStudent:public Student public: void display(); /over

7、lap / . ; void fn() GraStudent gs; gs.display(); /call GraStudent:display() 捆绑子类对象访问成员函数,则首先匹配子类,然后父类,再父类的父类,依此类推,1/20/2019,10,拷贝构造: 子类若没有定义拷贝构造函数,则子类对象在拷贝创建时先调用父类的拷贝构造函数,再完成自己的位对位拷贝 父类若没有定义拷贝构造函数,则子类对象在拷贝创建中调用父类默认的拷贝构造函数 赋值操作符原理相似,1/20/2019,11,4. 继承方式 ( Inheritance Mode ),继承可以公有继承,保护继承和私有继承 公有继承是普通

8、继承,基类可以为大多数应用服务也可以重复继承 保护继承是“单传”继承,只继承给自己的后代,应用是以子孙的公有成员函数来对外展开服务的 私有继承是“绝版”继承,该基类只继承直接的子类,而不考虑让子类再继承下去,1/20/2019,12,继承体系中,子类可以在祖先类成员可见的范围中调整其访问控制属性class Aint a1; public:int a2; ; class B : private A public:using A:a2; / a2从私有转为公有using A:a1; / 错: a1不可见 ; int main()B d;d.a2 = 1; / ok ,1/20/2019,13,5.

9、 继承与组合 ( Inheritance & Composition ),组合:类中含有对象成员,称为组合式包含 继承:子类继承了父类,称为子类对象对父类对象的继承式包含 继承和组合都重用了类设计 继承重用场合,父类对象就在自己家里,无须捆绑父类对象便能对其操作但是操作受到了父类访问控制属性设定的制约 组合重用场合,使用对象成员的操作需捆绑对象成员,而且只能使用对象的公有成员,继承部分,派生部分,其他数据成员,Student对象,Advisor对象,研究生对象,组合式包含,继承式包含,1/20/2019,14,继承型的Circle类头文件: #include“point.h“ class Ci

10、rcle : public Pointdouble radius; public:/成员函数 ;,组合型的Circle类头文件: #include“point.h“ class CirclePoint point;double radius; public:/成员函数 ;,公有成员函数实现 不同,但可以让界 面相同,从而不影响 编程者使用,继承与组合在于 实现技术不同,1/20/2019,15,使用含有继承和组合的子类:只要外界不直接或无法直接使用该子类的祖先类成员或对象成员,仅提供公有的成员函数,则对外界来说,无所谓该子类的继承式包含还是组合式包含(包含组合或继承的哪种头文件都可): #in

11、clude”point.h” #include“circle.h” /组合或继承 int fn()Circle c(Point(2.3, 5.6), 7);c.moveTo(1, 2);c.modifyRadius(3);/ ,1/20/2019,16,6. 多继承概念 ( Multi-Inheritance Concept ),多继承: 一个实体,来自多个类对象的组合因而它同时也可以继承多个基类来实现,1/20/2019,17,多继承的主要技术问题: 由于子类可以访问多个基类,而基类之间没有专门的协调,所以,基类可能出现相同的名字,这于子类来说,要访问这种名字增加了编程的复杂性,不得不要在名

12、字前加上前缀 然而,这种同名也许意义相同,操作这种名字本身便是一种分别性操作,不合逻辑 于是便寻求一种分离共性,统一基类的解决办法(见CH12.5). 但是,不同的父类拥有共性基类,访问基类成员仍然存在相同名字冲突问题,1/20/2019,18,7. 多继承技术 ( Multi-Inheritance Technology ),解决多继承基类名字冲突问题 将多个父类看成同一基类下的不同子类,而所需要派生的子类来自于这些不同子类于是形成一个棱形结构,Bed,sleep(),Sofa,watchTV(),SleeperSofa,FoldOut(),Furnitureweight,getWeight(),setWeight(),1/20/2019,19,多个不同子类(如,床、沙发)在继承基类的方式上采取虚拟继承,它的作用是,当对象创建上产生基类重叠时,略去重复产生基类对象空间的行为:class Bed : virtual public Furniturepublic:void sleep()const cout“Sleeping.n“;多继承这种性质的子类:class SleeperSofa:public Bed,public Sofapublic:void foldOut()constcout“Foldout.n“;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报