关于继承的sizeof有关问题
关于继承的sizeof问题#include iostream#include memory.h#include assert.husing namespace stdcl
关于继承的sizeof问题
#include <iostream>
#include <memory.h>
#include <assert.h>
using namespace std;
class A{
};
class A2{
};
class B:public A{
};
class C:public virtual B{
};
class D:public A,public A2{
};
int main(int argc,char *argv[])
{
cout<<"sizeof(A):"<<sizeof(A)<<endl; //result=1;
cout<<"sizeof(B):"<<sizeof(B)<<endl; //result=1;
cout<<"sizeof(C):"<<sizeof(C)<<endl; //result=4; 虚继承?这里感觉应该是8
cout<<"sizeof(D):"<<sizeof(D)<<endl;//result=1
return 0;
}
这里sizeof(c)=1个字节(类c为空类)+指向父类的ptr+父类的1个字节=6个字节?考虑到字节对齐,应该是8个字节。
sizeof(c)=4的话只考虑一个指向父类的指针吧。 继承 sizeof 类
[解决办法]一个类即使没有虚函数、虚基类和数据成员,空间至少也要为1个字节。
从一个没有虚函数、虚基类和数据成员的基类派生,基类所占空间会被优化为0。
如果有虚基类或虚函数,则必然有虚拟表指针,32位系统下指针一般为4字节。
C有虚基类,所以有一个虚拟表指针。
既然已经有了虚拟表指针,C就不是空类,不会附加那一个字节。
B是空类,它的一个字节被优化掉了。
所以C的大小就是4字节。