2

VC6编译

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 岁???我认为他们是一样的!

4

1 回答 1

0

基于编译后对内存的快速检查,只有当 B 具有构造函数时,才会在 B 和 A 的布局之间添加一个 4 字节块/焊盘。我不确定其中的原因,但是如果您打算复制内存,我建议您不要这样做。

no B::B() //类版本 2
const B::'vftable'{for 'B'}
const B::'vbtable'
y
const B::'vftable'{for 'A'}
x
size = 20

包括 B::B() //类版本 3
const B::'vftable'{for 'B'}
const B::'vbtable'
y
0x00000000 // 4 个字节
const B::'vftable'{for 'A' }
x
大小 = 24

于 2012-07-24T06:16:34.917 回答