一、虚继承对C++对象内存模型造成的影响
先看示例:
#include <iostream>
using namespace std;
class BB
{
public:
int bb_;
};
class B1 : virtual public BB
{
public:
int b1_;
};
class B2 : virtual public BB
{
public:
int b2_;
};
class DD : public B1, public B2
{
public:
int dd_;
};
int main(void)
{
cout<<sizeof(BB)<<endl;
cout<<sizeof(B1)<<endl;
cout<<sizeof(DD)<<endl;
B1 b1;
long** p;
cout<<&b1<<endl;
cout<<&b1.bb_<<endl;
cout<<&b1.b1_<<endl;
p = (long**)&b1;
cout<<p[0][0]<<endl;
cout<<p[0][1]<<endl;
DD dd;
cout<<&dd<<endl;
cout<<&dd.bb_<<endl;
cout<<&dd.b1_<<endl;
cout<<&dd.b2_<<endl;
cout<<&dd.dd_<<endl;
p = (long**)dd;
cout<<p[0][0]<<endl;
cout<<p[0][1]<<endl;
cout<<endl;
cout<<p[2][0]<<endl;
cout<<p[2][1]<<endl;
BB* pp;
pp = ⅆ
pp->bb_; // 通过间接访问,这需要运行时的支持
return 0;
}
运行结果:
根据结果我们可以分析出B1内存模型:
Dd对象内存模型:
由上面的对象内存模型可以看出,虚基类是共享的,所以虚基类表里要保存本虚基类表指针类地址到到虚基类的偏移。如果通过对象访问对象成员可以直接访问。如果通过指针访问虚基类里的成员,是通过虚基类地址与虚基类指针地址的差间接访问的。