求:用了虚基类继承后派生类的 sizeof()结果分析
简单的调试程序如下:
#include <iostream.h>
class a
{
private:
int x;
};
class b: virtual public a
{
private:
int y;
};
class c: virtual public a
{
private:
int z;
};
class d:public b,public c
{
private:
int m;
};
int main(int argc, char* argv[])
{
cout<<sizeof(a)<<endl;
cout<<sizeof(b)<<endl;
cout<<sizeof(c)<<endl;
cout<<sizeof(d)<<endl;
return 0;
}
在VC6.0下调试结果为
4
12
12
24
有哪位高手能解释一下结果,特别是b、c、d的结果
问题点数:20、回复次数:13Top
1 楼evanmengcn(evan)回复于 2005-06-04 19:13:47 得分 5
去看Inside C++ Object Model就全明白了。Top
2 楼sunman1982(冥王星)回复于 2005-06-04 19:15:15 得分 0
mark!!!-_-!!Top
3 楼evanmengcn(evan)回复于 2005-06-04 19:28:00 得分 0
啊……应该是Inside The C++ Object Model……
惭愧惭愧…………Top
4 楼horisly(SUN YAT-SEN UNIVERSITY (逸仙先生))回复于 2005-06-04 20:05:13 得分 10
虚继承的子类都要包含一个指向基类的指针,从而实现动态联编的。
所以:
b{x,y,pvtr_a} ---->4*3=12
c{x,z,pvtr_a} ---->4*3=12
d{x,y,z,m,pvtr_b,pvtr_c,pvtr_a} //虚继承只保留一份公共基类的数据。 ---> 4*6=24
Top
5 楼horisly(SUN YAT-SEN UNIVERSITY (逸仙先生))回复于 2005-06-04 20:05:50 得分 0
你如果把这两个virtual去掉的话,就可以比较到不同了Top
6 楼chinaren2k(康康)回复于 2005-06-04 20:11:10 得分 0
虚函数其实是一个指针
站4位Top
7 楼theseus_wu(感悟人生)回复于 2005-06-04 21:17:03 得分 0
我也是怀疑有指针传入,但不敢肯定,呵呵
还有一个问题,this指针为什么没算进去啊?Top
8 楼qhfu(改个名字)回复于 2005-06-04 21:58:39 得分 5
函数并不占用类的空间吧! 数据才占 空间,这是我的理解, 不知道有没有理解错 ,
如果是一个多太类, 会有一个vptr 指向虚函数 表Top
9 楼foochow(无聊,灌水......)回复于 2005-06-04 22:56:43 得分 0
楼主程序中少了一个纯虚函数吧,随便加个就可以看出不同,要不你改成public也可以比较出不同Top
10 楼sankt(宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒.)回复于 2005-06-04 23:06:56 得分 0
学习
Top
11 楼theseus_wu(感悟人生)回复于 2005-06-04 23:09:42 得分 0
我用的是虚基类,又不是抽象基类,为什么要在基类中加纯虚函数啊??
我讨论的是在虚基类继承下,编译器为对象开辟多少内存空间的问题。还没和函数打交道。Top
12 楼qhfu(改个名字)回复于 2005-06-04 23:15:50 得分 0
虚继承 还有个 vbtr 表Top
13 楼foochow(无聊,灌水......)回复于 2005-06-05 00:17:21 得分 0
嘿嘿,搞错了, horisly(SUN YAT-SEN UNIVERSITY (逸仙先生)) 解释得很清楚了^_^Top




