如下,a 12字节,b8字节如果a,b均只继承BASE1,BASE2,写法不变,则a 8字节,b 4字节,
b的4字节很容易理解,按照书上的解释,会有一个虚基类表指针,但问题是a又多出了4字节。
而且每多出一个这样的虚继承,子类就会大4字节,貌似在子类中保存了虚基类指针,但书上明明白白说的不是这样的。
如果给BASE1添加一个int成员,则b变成8字节,一个虚表指针,一个int,而a仍然是8字节,这样说明并不是
保存的虚基类指针,而是类似占位符一样的。在linux上就没有这个问题,a,b都是4字节,很好,很和谐。我知道M$的编译器和别家不同,但我就是没想明白
小盖是怎么做的。
#include <iostream>
using namespace std;class BASE1
{
public:
};
class BASE2
{
public:};
class BASE3
{
public:};
class BASE4
{};class a : virtual public BASE1,virtual public BASE2,virtual public BASE3
{
public:
a(){};
~a(){};
};
class b: public BASE1,virtual public BASE2,virtual public BASE3
{
public:
b(){};
~b(){};
};
int main(int argc, char* argv[])
{
a e1;
b e2; cout<<&e1<<endl;
cout<<&e2<<endl; cout<<sizeof(e1)<<endl;
cout<<sizeof(e2)<<endl; return 0;
}