class A
{
public:
int x;
public:
virtual void funA() { }
};
class B : virtual public A
{
public:
int y;
public:
virtual void funA() { }
virtual void funB() { }
};
sizeof(B)=20 // because of B::vptr+vbptr+B::y+A::vptr+A::x = 5*4
class A
{
public:
int x;
public:
virtual void funA() { }
};
class B : virtual public A
{
public:
int y;
public:
B() {}
virtual void funB() { }
};
sizeof(B)=20 // because of B::vptr+vbptr+B::y+A::vptr+A::x = 5*4
class A
{
public:
int x;
public:
virtual void funA() { }
};
class B : virtual public A
{
public:
int y;
public:
B() {}
virtual void funA() { }
virtual void funB() { }
};
sizeof(B)=24
我无法理解,为什么它会是24 ??? 我认为他们是一样的!
答案 0 :(得分:0)
基于编译后内存的快速检查,只有当B有构造函数时,才会在B和A的布局之间添加一个4字节的块/填充。我不确定是什么原因,但如果你计划复制内存,我会反对它。
没有B :: B()// 类版本2
const B ::'vftable'{代表'B'}
const B ::'vbtable'
ÿ
const B ::'vftable'{代表'A'}
X
size = 20
包括B :: B()// 类版本3
const B ::'vftable'{代表'B'}
const B ::'vbtable'
ÿ
0x00000000 // 4个字节
const B ::'vftable'{代表'A'}
X
size = 24