先看普通继承的内存是如何组成的:
class base
{
private:
int ma;
};
class derive: public base
{
private :
int mb;
};
/*
base::
ma
mb
*/
``
虚继承的对象内存分布:
class base
{
private:
int ma;
};
class derive:virtual public base
{
private :
int mb;
};
/*
1:先按照普通继承的方式写出来
base::
ma
mb
2:再把虚基类放到最后面,原来的位置放置vbptr虚基类指针;
vbptr
mb
base::
ma
*/
vbptr指向虚基类表,表的第一行是vbptr指针离子对象的偏移量,一般为0
表的第2行是vbptr离虚基类数据的偏移量,上例是8;
当一个类多继承时,虚基类的优先级最高,也就是说先构造虚基类