- 1、本文档共58页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
执行C的构造函数前先调用B1、B2构造函数;执行B1、B2构造函数前先分别调用A的构造函数。 A B1 B2 C A为C的公共基类 eg. 数据成员二义性 三、混合多继承中的构造函数 class C:public B1,public B2 { }; 当前第30页\共有58页\编于星期三\12点 1、数据成员二义性 假设图中类A有数据成员a, 则C中有两个a成员,a是哪个 派生类的成员?产生了二义性。 解决方法: (1)加类名分辨符B1:: 或 B2:: (2)定义虚基类 eg1. 数据成员二义性 A(a) B1(a,b1) B2(a,b2) C(a,b1,b2,c) 四、多继承中二义性问题的解决 当前第31页\共有58页\编于星期三\12点 2、函数成员二义性 B1,B2中都含有print() 成员函数,C继承了B1,B2, 则C中有两个print()函数。 解决方法:加类区分符:: eg2. 函数成员二义性 B1(print()) B2(print()) C 当前第32页\共有58页\编于星期三\12点 §9.3 虚基类 消除数据成员二义性的两种方法的区别: (1)”类名::”法:消除二义性同时实现程序设计的多态性,但在派生类对象中存在多个公共基类的同名数据成员 (2)”虚函数”法:消除二义性,且在派生类对象中只存在一个公共基类的数据成员 设计虚基类: (1)一个基类有多于一个派生类时, 在这些派生类“继承方式”前加上 virtual 关键字。 class B1:virtual public A class B2:virtual public A 此时将公共基类A称为虚基类。 A B1 B2 C 当前第33页\共有58页\编于星期三\12点 (2) 虚基类子对象由最新派生出来的派生类直接初始化。 B1,B2对类A子对象初始化, C 也要对类A子对象初始化。 eg. 虚基类 注意:对非虚基类,不能在C中对A类子对象初始化。 A B1 B2 C 当前第34页\共有58页\编于星期三\12点 §9.4类的虚函数和多态性 对于相同的函数调用,依赖每个对象自己做出恰当的响应,这是多态性的关键思想。 多态性(polymorphism):不同对象在接收同样的消息时,所做出的响应不同。 多态性的实现依赖于动态联编。 指调用名称相同的成员函数 指不同派生类的成员函数 当前第35页\共有58页\编于星期三\12点 一、滞后联编 联编:指一个标识符名和一个存储地址联系在一起的过程。 1、静态联编(早期联编) 指:联编工作出现在编译连接阶段,因为这种联编过程在程序开始运行之前完成,所以又称早期联编。 在编译时就解决了程序中的操作调用与执行该操作代码间的关系,确定这种关系又被称为束定,因此,静态联编又称为静态束定。 2、动态联编(滞后联编) 指:在程序执行时进行的联编,称动态联编,或称动态束定,又叫滞后联编。 动态联编时在不同阶段被束定的类的对象将是不同的。 动态联编的实现:C++中,在虚函数的支持下实现。 当前第36页\共有58页\编于星期三\12点 二、虚函数的定义 1、定义: virtual 成员函数原型; 2、注意: (1)只有在类的继承关系中才存在虚函数。在基类中声明某成员函数为虚函数,则派生类中(名字、参数个数、参数类型和返回值类型都)相同的成员函数都视作虚函数。 (2)使用虚函数须利用赋值兼容规则,要求public继承方式。 (3)多态性使我们编写的程序在处理同一个类层次结构下类的对象时好像它们是基类的所有对象一样。 当前第37页\共有58页\编于星期三\12点 三、虚函数的使用 多态性是利用基类的指针句柄和基类的引用句柄,而不是利用名字句柄。 实现多态的步骤: (1)定义基类指针 (2)用该指针指向基类或派生类对象 (3)当程序发送虚函数消息时:若指针指向基类对象,系统调用基类成员函数,若指针指向派生类对象,系统调用派生类成员函数。 (4)若没有步骤(2)中赋值,系统按早期联编方式调用基类成员函数。 当前第38页\共有58页\编于星期三\12点 class X1{ int x; public: X1(int xx=0){x=xx;} virtual void Output() {cout“x=“xendl;} }; cl
文档评论(0)