多重继承与虚继承

多重继承

多重继承就是从多个直接基类继承。继承要求与普通继承一样。

构造

当不使用某个基类的继承构造函数初始化该部分时,就会使用该基类的默认构造函数。

另外,构造函数的顺序与我们写的顺序无关,是根据派生列表的顺序,派生树dfs的顺序。

当使用using继承了基类中同名同参的构造函数时,必须自行定义一个接受同样参数的构造函数来覆盖掉。

向基类的转换

对于编译器来说,只要是基类,那么转换都是一样好的,因此如果有函数重载内是基类,那么可能会出现二义性错误。

基类指针指向派生类对象时,只能使用自己基类部分的成员。

作用域(派生类的名字会覆盖基类的名字,因为更局部)

当使用基类中的名字的时候,会同时在继承的所有基类中查找,很容易就会找到相同的。在继承的不同基类中有相同的名字并没有什么问题,这只是潜在的二义性问题而已,使用时必须指出作用域,或者一种更好的方式是自己定义并覆盖。

虚继承

有的时候,在整一个继承体系中会出现对某一个基类的多次继承(当存在多重继承的时候),此时就会有多个同样基类的实例,这是我们所不希望的。我们可以使用虚继承来让某个类同意共享它的某个基类,在这种情况下,无论出现多少次基类,使用的都是同一个实例。

通过class derived:virtual public/… base就可以虚继承,并不会对本类造成任何影响,而表示本类的派生类都将共享本基类的base这个基类。

对于基类的成员,首先,派生类会覆盖基类的成员,当多重继承时,如果同一级的基类下有同名,则会二义性。

构造

由于虚基类可能会被多次构造,因此,若是存在虚基类,则必须由最底层的派生类来负责初始化,也就是在初始化列表中调用虚基类的构造函数。

如果最底层的派生类没有显式化构造虚基类,则虚基类的默认构造函数会被调用。

整体的构造顺序虚基类总是先于非虚基类。

折构的顺序正好相反。


多重继承与虚继承
https://lhish.github.io/project/hide/多重继承与虚继承/
作者
lhy
发布于
2024年6月30日
许可协议