1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
ss-02(C++).ppt

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 派生类中的子对象 当继承基类时,在派生类中就获得了基类所有数据成员的副本,该副本成为子对象。 例1: b1, b2分别是d1,d2的基类,mi多继承了d1和d2 b1 b2 d1 mi d2 b1 b2 d1 b1 d2 b2 * 例2: 与例1相似,不同的是d1,d2具有共同的基类d b d1 mi d2 b b d1 b d2 b 继承树中出现菱形,出现问题!! * 子对象重叠 在多继承中,当继承关系出现菱形时,出现子对象重叠的问题 ——向上映射二义性问题。 例: #include using namespace std; class base public: virtual char* vf const 0; ; class d1:public base public: char* vf const return “d1”; ; class d2:public base public: char* vf const return “d2”; ; class mi: public d1,public d2 ; main tstash b; b.add new d1 ; b.add new d2 ; b.add new mi ; for int i 0;i b.count;i++ cout b[i]- vf end; * 上述例子中的程序存在两个二义性问题: 指向mi对象的基类指针调用vf时无法判断到底应该调用哪个函数——是d1中的vf还是d2中的vf? 创建一个mi的实例,通过向上映射将其指针转换围base *型时,由于无法确定是指向d1子对象中的base还是d2子对象中的base,从而导致编译器不受理。 #include using namespace std; class base public: virtual char* vf const 0; ; class d1:public base public: char* vf const return “d1”; ; class d2:public base public: char* vf const return “d2”; ; class mi: public d1,public d2 ; main tstash b; b.add new d1 ; b.add new d2 ; b.add new mi ; for int i 0;i b.count;i++ cout b[i]- vf end; 问题1 问题2 * 如何解决上述两个问题? 针对问题1 必须对类mi中的函数vf 重新定义以消除二义性。 针对问题2 在语言级别来解决,引入“虚基类”的概念。如果用virtual的方式继承一个基类,则在派生类中只会出现一个基类子对象。 #include using namespace std; class base public: virtual char* vf const 0; ; class d1:virtual public base public: char* vf const return “d1”; ; class d2:virtual public base public: char* vf const return “d2”; ; class mi: public d1,public d2 char* vf const return “d1”; ; main tstash b; b.add new d1 ; b.add new d2 ; b.add new mi ; for int i 0;i b.count;i++ cout b[i]- vf end; * 解决之道: 为每个包含虚基类的类建立虚基类表 在每一个包含虚基类的派生类对象中加入指向虚基类的指针 编写代码实现对基类地址的正确访问 * 利用多继承修复接口 如果有一个很好用的类库摆在你的面前,你会用吗? ?当然,你会用 但是

文档评论(0)

xinshengwencai + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:5311233133000002

1亿VIP精品文档

相关文档