请教包含虚函数的类的空间占用
class A
{
private:
int a;
public:
virtual void func(){ }
};
class B : public A
{
private:
int b;
public:
virtual void func(){ }
virtual void func1(){ }
};
void main(void)
{
cout << "sizeof(A) = " << sizeof(A) << endl;
cout << "sizeof(B) = " << sizeof(B) << endl;
}
结果:
sizeof(A) = 8
sizeof(B) = 12
我想问的是为什么B的返回是12,不是8?
[解决办法]
有虚函数, 只增加一个 vptr
[解决办法]
virtual void func1(){ } <-- 增加了(32位系统) int32 4字节
[解决办法]
因为B从A继承了int a,自己又定义了int b,所以比A多4。
[解决办法]
首先B继承自A类。
所以A类的数据不论是私有保护还是公有的数据 在它的子类B中都是被遗传的 只是其子类B无法直接访问遗传自父类的私有的数据. 所以例子中A类的private成员int a;在子类B中也是存在的 ,占了B类的4字节位置。而对于虚函数 ...类中一旦存在虚函数成员(不论多少个,只要存在虚函数),那么就会多出,而且只多出一个地址指针(通常在构造的时候会被放在类数据的首位)指向虚函数列表,这个指针的大小是4字节 . 所以A和B类内都含有虚函数所以虚函数的因素在A与B上没有导致数据大小的差异。
真正导致差异的是B类又添加了一个成员int b; 多出了4字节.