C++虚继承的一些细节
- 何时使用虚继承
- 普通继承的类对象布局
- 虚继承类对象布局
- 虚函数表指针
- 虚函数表内容
何时使用虚继承
看代码,代码主要是菱形继承,base里面的成员变量会存在二义性
#include<iostream>
using namespace std;
class base
{
public:
int a;
};
class derived1:public base
{
public:
int b;
};
class derived2:public base
{
public:
int c;
};
class child :public derived1, public derived2
{
public:
int d;
};
int main()
{
child s;
s.a = 100;//a存在二义性
return 0;
}
这时解决办法是加上作用域:
s.derived1::a = 100;
s.derived2::a = 100;
但是这种代码可读性非常低,而且由上图可以看到浪费内存空间,于是就引出了虚继承来解决以上问题
必须在直接继承基类的地方直接采用虚继承,只要有一个不采用虚继承,以上问题就得不到解决
普通继承的类对象布局
普通继承的类对象成员函数布局,就是根据继承的顺序,按照作用域进行布局
虚继承类对象布局
增加一个vbptr指向虚基类表
虚函数表指针
指向虚基类表
虚函数表内容
第0行指向vbptr相对于自己的偏移量
第1行是虚基类成员的偏移量