https://www.cnblogs.com/nexiyi/archive/2013/06/16/3138568.html
这篇关于继承和组合博客值得一看
复杂的菱形继承及菱形虚拟继承
- 单继承:一个子类只有一个直接父类时称这个继承关系为单继承
- 多继承:一个子类有两个或以上直接父类时称这个继承关系为多继承
在这里插入图片描述
- 菱形继承:菱形继承是多继承的一种特殊情况
- 数据冗余:孙子类有两份爷爷类数据
- 二义性:孙子类访问爷爷类成员时,每个父类都有对应的爷爷成员,编译器找不到
1. 不采用多继承方式
2.菱形虚拟继承 :virtual 关键字
- 当父类继承爷爷类时加上virtual
菱形虚拟继承底层:内存对象成员模型
将爷爷类中对象放到对象组成的最下面,所有原本存储爷爷类成员的位置存放的是一个指针,指向一张表。
这些指针是虚基表指针,指向的表叫虚基表,虚记表中存着偏移量,通过偏移量可以找到该成员实际位置。
(当前指针 + 偏移量)[使得继承环节上每个类类型的指针都能访问到]
class Base{
int var;
};
class Base1 : virtual public Base
{
int a1;
};
class Base2 : virtual public Base
{
int a2;
};
class Derive :public Base1 ,public Base2
{
int Drv;
};