代码分析虚继承类的所占内存大小问题
//c++类的虚继承问题,代码有任何问题,请留言相告,不胜感激
//每个对象里都有虚表指针,指向虚表,虚表里存放了虚函数的地址。虚函数表示顺序的存放虚函数的地址的,不需要用到链表#include <iostream>
#include<memory.h>
#include<assert.h>
using namespace std;
class A
{
public:
virtual void aa() {};//A类有一个虚函数,必然有一个对应的虚函数表来记录对应的函数入口地址
//每个地址需要一个虚指针,指针的大小为4
private:
char k[3];//每一个char值所占位置为1(但是编译一般以4的倍数做数据对齐),故其所占的字节数为4
};
//综上A类所占的字节数应该为8
/*各位看官继续往下走*/
//由于B继承了A,同时B类还有自己的虚函数,所以首先应当有虚表指针,指向自己的虚函数表
//虚继承的实现,首先加入一个虚类指针指向其父类,然后包含父类的所有内容
//sizeof(B)=char k[3]+j类虚指针+sizeof(A)=4+4+8=16
class B :public virtual A
{
char j[3];//同上,j所占的字节为4
public:
virtual void bb() {};
};
//C类=C类虚指针+char i[3]+sizeof(B)=4+4+16=24
class C :public virtual B
{
char i[3];
public:
virtual void cc() {};
};
int main(int argc,char*argv[])
{
cout << "sizeof(A):" << sizeof(A) << endl;
cout << "sizeof(B):" << sizeof(B) << endl;
cout << "sizeof(C):" << sizeof(C) << endl;
}
gcc 运行结果是:8 16 24
vs2015运行结果是: