首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

VS编译器下类的虚继承的sizeof大小如何算

2012-05-09 
VS编译器下类的虚继承的sizeof大小怎么算?#include iostreamusing namespace stdclass Base1{virtual v

VS编译器下类的虚继承的sizeof大小怎么算?
#include <iostream>

using namespace std;

class Base1{
  virtual void fun1(){}
  virtual void fun11(){}
public:
virtual ~Base1(){}
};
 
class Base2{
  virtual void fun2(){}
};
 
class DerivedFromOne: virtual public Base2
{
  virtual void fun2(){}
  virtual void fun22(){}
};
 
class DerivedFromTwo: virtual public Base1, virtual public Base2
{
  virtual void fun3(){}
};
 
void main()
{
  Base1 b1;
  Base2 b2;
  DerivedFromOne d1;
  DerivedFromTwo d2;
  cout << "sizeof Base1 " << sizeof(b1) << endl;
  cout << "sizeof Base1 " << sizeof(b2) << endl;
  cout << "sizeof FromOne " << sizeof(d1) << endl;
  cout << "sizeof FromTwo " << sizeof(d2) << endl;
  getchar();
}

结果为:
4
4
12
16

我debug看的变量结构图:


比如d1我看到两个vfptr,怎么就是12呢?

我不明白d1为什么是12,而d2为什么是16,而且若
class DerivedFromTwo: virtual public Base1, public Base2,则
d2是12 ?
我实在是没看明白呀。。

注意是VS编译器,不是GCC编译器,它们的虚继承sizeof结果不同。
请高手赐教。我想了好久了。



[解决办法]

C/C++ code
virtual 继承的时候还有一个虚基类指针,所以d1是 12.class DerivedFromTwo: virtual public Base1, public Base2这个是12则说明Base1和Base2的vptable在DerivedFromTwo的布局中进行了合并,只使用到了一个指针。那么有 4(DerivedFromTwo vfptr) + 4(Base1,Base2合并的虚函数指针) + 4( Bass1虚基类指针) = 12,如果变成:class DerivedFromTwo: virtual public Base1, virtual public Base2则sizeof(DerivedFromTwo) = 16 (多加了上个 Base2虚基类指针)为什么说Base1,Base2的虚函数指针在DerviedFromTwo中合并了呢,计算下 class DerivedFromTwo: public Base1, public Base2,sizeof(DerviedFromTwo) = 8就非常明显了。研究具体编译具细节会让LZ你越发不明白原理,建议好好研究下《inside c++ ojbect module》 

热点排行