VS编译器下类的虚继承的sizeof大小如何算
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结果不同。
请高手赐教。我想了好久了。
------解决方案--------------------
#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》