单独的虚继承,单独的虚函数的类对象模型布局我们已经讨论过,接下来两者结合的对象布局如下,先看代码
代码
#include<iostream>
using namespace std;
class Base
{
public:virtual void show(){cout<<"base show()"<<endl;}
public:int ma;
};class Derived : virtual public Base
{
public:virtual void show(){cout<<"Derived show()"<<endl;}
public:int mb;
};int main()
{return 0;
}
1、先按照常规布局,不考虑虚继承,布局如下
1> class Derived size(12):
1> +---
1> | +--- (base class Base)
1> 0 | | {vfptr}
1> 4 | | ma
1> | +---
1> 8 | mb
1> +---
2、再考虑虚继承,将虚基类对象整体放在最下面,然后再原来的位置放vbptr
1> class Derived size(16):
1> +---
1> 0 | {vbptr}
1> 4 | mb
1> +---
1> +--- (virtual base Base)
1> 8 | {vfptr}
1> 12 | ma
1> +---
1>
1> Derived::$vbtable@:
1> 0 | 0
1> 1 | 8 (Derivedd(Derived+0)Base)