日历
网志分类
· 所有网志 (91)
· 程序员面试题收集 (11)
· 算法 (25)
· Paper (3)
· c++,java (37)
· bbs search project (2)
· career (7)
· 设计模式 (0)
· 未分类 (6)
站内搜索
友情链接
· 我的歪酷 非非共享界
· 涛声依旧blog,也有很多题收集
· jammy 生活就是映像
· Aleph mm's
· onebird(一鸣)
· lucene.com.cn
· Goolge黑板报--没事看看
· jjing

订阅 RSS

0034088

歪酷博客

kua's

海明威说--
“这个世界是美好的,值得我们为之奋斗”

我相信后半句...

                                                             kuapig@gmail.com


« 上一篇: c++设计与演化读书笔记---new,delete相关,存储管理--重写,重载 下一篇: Autodesk--c++题 »
kua @ 2007-05-14 12:59

关于多重继承,以前想的不过,因为遇到多重继承的机会本身就不多。
在java里,用了接口的机制实现了c++中类似多重继承的功能。我个人认为
java的方式要好点,因为首先逻辑清楚很多。c++的多重继承总给人一种很麻烦,很容易出错的感觉。而且确实多重继承里面有一些很隐晦的语法。其次,java的接口使用起来也更舒服,简洁一点。
多重继承的一个特殊的例子。
Class A;
Class B: public A;
Class C: public A;
Class D: public B, public C;

这个例子就是一个容易混淆的例子,让人觉得很头疼。D从B,C继承,而B和C又都是A的子类。也就是说D间接的继承了两次A
因为继承是等于拥有了一个父类的切片,那这里D有几个A的切片呢????
这是个问题: 答案是两个
D d;
其构造函数调用顺序如下:
A::A();
B::B();
A::A();
C::C();
D::D();
也就是说D中其实是有两个A,A中的所有数据成员在D里都会有两份。
编译器(至少vc是)似乎不能识别着两个A其实是同一个东西,如果A中有函数F()的话
调用D::F()是有歧义的,编译器会问你究竟是B所对应的A的函数F呢,还是C所对应的A的函数呢
其实是没有歧义的,都是一个A啊。

解决之道:virtual 关键字
Class A;
Class B: public  virtual A;
Class C: public  virtual A;
Class D: public B, public C;
加了virtual之后,D中的A就只有一份了,构造函数调用顺序如下:
A::A();
B::B();
C::C();
D::D();

此时调用A::F()也没有歧义了




评论 / 个人网页 / 扔小纸条
* 昵称

已经注册过? 请登录

新用户请先注册 以便能显示头像及追踪评论回复

Email
网址
* 评论
表情
 


 

分类小组论坛
杂谈 , 娱乐、八卦 , 文学、艺术 , 体育 , 旅游、同城 , 象牙塔 , 情感 , 时尚、生活 , 星座 , 科技

请注意遵守中华人民共和国法律法规, 如威胁到本站生存, 将依法向有关部门报告, 同时本站的相关记录可能成为对您不利的证据.

相关法律法规
全国人大常委会关于维护互联网安全的决定
中华人民共和国计算机信息系统安全保护条例
中华人民共和国计算机信息网络国际联网管理暂行规定
计算机信息网络国际联网安全保护管理办法
计算机信息系统国际联网保密管理规定