#include <iostream>
#include <cstdlib>
using std::cout;
class A
{
public :
A() { cout << "A()" << this << "\n";}
~A() { cout << "~A()" << this << "\n";}
//void func() { }
virtual void debug(int a) { cout << "A::debug";}
private :
int a;
};
class A1 : public A
{
public :
A1() { cout << "A1()"<< this << "\n";}
~A1() { cout << "~A1()"<< this << "\n";}
private :
int a1;
};
class A2 : public A
{
public :
A2() { cout << "A2()"<< this << "\n";}
~A2() { cout << "~A2()"<< this << "\n";}
private :
int a2;
};
class B : public A1, public A2
{
public :
B() { cout << "B()"<< this << "\n";}
~B() { cout << "~B()"<< this << "\n";}
void debug() { cout << "B::debug()"; }
private :
int a3;
};
int main()
{
cout << "sizeof(int)" << sizeof(int) << "\n";
cout << "sizeof(void*)" << sizeof(void*) << "\n";
cout << "sizeof(A): " << sizeof(A) << "\n";
cout << "sizeof(A1): " << sizeof(A1) << "\n";
cout << "sizeof(A2): " << sizeof(A2) << "\n";
cout << "sizeof(B): " << sizeof(B) << "\n";
B b;
b.debug();
}
输出:我的4字节在哪里?
sizeof(int)4
sizeof(void*)4
sizeof(A): 8
sizeof(A1): 12
sizeof(A2): 12
**sizeof(B): 28**
A()0x28fef4
A1()0x28fef4
**A()0x28ff00**
A2()0x28ff00
B()0x28fef4
B::debug()~B()0x28fef4
~A2()0x28ff00
~A()0x28ff00
~A1()0x28fef4
~A()0x28fef4
两个A1和A2是4(VTBL)+ 4(A'sint)+ 4(各自INT)= 12个字节,但B是28个字节 我知道它不能保证但可能使用这4个字节的可能是什么......我没有看到任何填充问题?任何人都可以指出我错过了什么?
尽管你没有看到它们,但填充问题在那里,并寻找更多的受害者。 – 2013-04-10 21:08:51
我一定错过了一些东西。 :耸耸肩:但你刚刚说过,每个A1和A2类都是12个字节。然后你已经显示B从它们中的每一个继承,并添加另一个int。我的简单思想是做12 + 12 + 4 = 28,并问'嗯?我不明白,什么缺少4个字节?' – enhzflep 2013-04-10 21:11:52
oops我完全错过了我在B中添加了一个int也...我也错误地怀疑A2的地址是前面4个字节... – mhk 2013-04-10 21:22:31