今天遇到一个多重虚拟继承的知识点,(使用virtual方式继承,为了保证继承后父类的内存布局只会存在一份)
1、重复继承(继承的多个父类中其父类有相同的超类)
类的继承关系如下:
class Base1 : public Base
class Base2: public Base
class Derived : public Base1, public Base2
Derived类的对象的内存布局与多继承相似,但是可以看到基类Base的子对象在Derived类的对象的内存中存在一份拷贝。这样直接使用Derived中基类Base的相关成员时,就会引发歧义,可使用多重虚拟继承消除之。
2、多重虚拟继承(使用virtual方式继承,为了保证继承后父类的内存布局只会存在一份)
类的继承关系如下:
class Base1 : virtual public Base
class Base2: virtual public Base
class Derived : public Base1, public Base2
Derived类的对象的内存布局与重复继承的类的对象的内存分布类似,但是基类Base的子对象没有拷贝一份,在对象的内存中仅存在在一个Base类的子对象。但是它的非static成员变量放置在对象的末尾处。