首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于继承的sizeof有关问题

2013-07-16 
关于继承的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字节。





引用:
这里sizeof(c)=1个字节(类c为空类)+指向父类的ptr+父类的1个字节=6个字节?考虑到字节对齐,应该是8个字节。
sizeof(c)=4的话只考虑一个指向父类的指针吧。


C有虚基类,所以有一个虚拟表指针。
既然已经有了虚拟表指针,C就不是空类,不会附加那一个字节。
B是空类,它的一个字节被优化掉了。
所以C的大小就是4字节。

热点排行