日历
网志分类
· 所有网志 (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

0034086

歪酷博客

kua's

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

我相信后半句...

                                                             kuapig@gmail.com


« 上一篇: 关于virtual 构造函数和 private 析构函数 下一篇: Temp »
kua @ 2007-10-29 15:37

以下都是我个人的理解,估计有问题,看的时候请慎重考虑,仔细判断
1.被虚继承的类就是虚基类
2.何为虚继承: 先说普通继承
普通继承: class B: public A, 
B从A继承,B会将A做一份copy,作为自身的一部分,然后在加自己独有的一部分。
加入A是一个有虚函数的类,考虑A和B的结构
sizeof(A) = sizeof(A的数据成员) + sizeof(vptr),这个vptr指向A类的 vtable
sizeof(B) = sizof(A的数据成员) + sizeof(B数据成员) + sizeof(vptr),这个vptr指向B类的vtable

虚继承: 虚继承与普通继承不同点在于,子类不实际的copy父类的一部分,而是生成一个引用,指向父类对象
但是在用sizeof统计大小时,依然将父类的成员变量统计在内,此时B的结构如下:
sizeof(B) = sizof(A的数据成员) + sizeof(B数据成员) + sizeof(vptr) + sizeof(pointer to A), vptr指向B类的vtable, 并且多了一个引用指向A对象

虚继承的这个特性在C++的多重继承应用中可以起到很好的作用:
一个没有虚继承的多重继承:
class A
{
 void f() ;
};
class B: public A
{
};
class C:public A
{
}
class D: public B, public C
{
}
void main()
{
 D d;
d.f();
}
这种情况下编译器会报错:D::f is ambiguous,could be the 'f' in base 'A' of base 'B' of class 'D',or the 'f' in base 'A' of base 'C' of class 'D'
很明显看出:d.f()是有歧义的,因为D中有2个A的copy,也就有2个A::f()函数,编译器不知道应该调用哪一个。

这个问题应用虚继承可以得到很好的解决,类定义重写如下:
class A
{
 void f() ;
};
class B: public virtual A
{
};
class C:public virtual A
{
}
class D: public B, public C
{
}
void main()
{
 D d;
d.f();
}
此时D中只指向一个A对象,调用d.f(),就是调用那个唯一的A的f()函数,没有歧义,顺利执行。因为此时B和C都是指向同一个A对象。
此时D的结构如下图:

需要注意的是B和C都必须是从A虚继承,只有一个是虚继承仍然会有歧义



最新评论


路人甲

2007-11-04 20:33 匿名 61.183.*.*

我错的好深。
暑假的时候在这里看到了一个好题目。
然后,其他就没看了,后来在这里发现了北电的一道原题,自责中。。。
再后来,今天群硕笔试,后发现一道原题在这里,也就是所谓的虚继承, 然而我的virtual写错了位置。。我悔啊我。。



路人甲

2007-11-04 20:54 匿名 61.183.*.*

今天笔的算法各有各的bt:
10亿个float类型数求其前10000个最大的数。还有,禁止使用数组、指针、递归求斐波拉数列。



kua

2007-11-05 16:46 匿名 202.120.*.*

群硕?
大可不必难过,这个地方建议最好不要去啊



路人甲

2007-11-05 22:05 匿名 61.183.*.*

嗯,在网上搜索过这个公司名身是不大好哈哈哈..
那个,能不能留个QQ咱们好分享下找工作的心得...向你请教~



kua

2007-11-06 09:53 匿名 202.120.*.*

。。。我不怎么上qq的
可以给我发email,不过我也很烂的



小强

2007-11-11 19:16 匿名 202.120.*.*

vc6和Gcc的sizeof结果不一样的



fall

2007-11-13 10:42 匿名 202.120.*.*

这个确实跟编译器相关,所以比较麻烦


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

已经注册过? 请登录

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

Email
网址
* 评论
表情
 


 

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

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

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