class OO //Object-Oriented
{
public:
OO():a(1),b(2),c(3){}
virtual int fun_oo(){};
virtual int fun_oo_cpy(){};
int a;
int b;
int c;
static int temp;
};
int main()
{
int size = 0;
OO test;
size = sizeof(test);
cout << "OO的大小为:" << size << endl;
}
g++编译后显示大小为16,有两点需要说明:
1、static的数据并保存在类对象里面;
2、由于里面有虚函数,所以需要一个vptr,只想class里面的virtual table
接着讨论在继承情况下的大小,修改代码为:
#include<iostream>
using namespace std;
class O
{
public:
int z;
virutal int fun_O(){};
}
class OO:public O //Object-Oriented
{
public:
OO():a(1),b(2),c(3){}
virtual int fun_oo(){};
virtual int fun_oo_cpy(){};
int a;
int b;
int c;
static int temp;
};
int main()
{
int size = 0;
OO test;
size = sizeof(test);
cout << "OO的大小为:" << size << endl;
}
g++编译后显示大小为20,这说明在这种继承体系下,对于对象test只有一个vptr被维护;
接下来讨论虚拟继承下的对象大小,修改代码为:
#include<iostream>
using namespace std;
class O
{
public:
int z;
virutal int fun_O(){};
}
class OO:public virtual O //Object-Oriented
{
public:
OO():a(1),b(2),c(3){}
virtual int fun_oo(){};
virtual int fun_oo_cpy(){};
int a;
int b;
int c;
static int temp;
};
int main()
{
int size = 0;
OO test;
size = sizeof(test);
cout << "OO的大小为:" << size << endl;
}
g++编译后显示大小为24,这说明在这种继承体系下,对于对象test不仅有有一个vptr被维护,只想OO的virtual table;还有一个vptr指向virtual base class的virual table。
《深度探究c++对象模型》中有一句话“每一个base class constructor设定其对象的vptr,使它指向相关的virtual table 之后,构造中的对象可以严格而正确的编程构造过程中所幻化出来的每一个class的对象”,可以很好的解释这个现象。