虚基类、虚继承

一、概念

虚基类:无论这个类在继承体系这种出现多少次,派生类中,都只会包含唯一一个共享的虚基类的内容

棱形继承:

// 棱形继承
class B1 : public A 

class B2 : public A

class C : public B1, public B1

// 在生成C的时候会多次构造A,从而A中的成员变量会有多份。
// 当用C去调用A中的成员变量时,就会出现二义性,而导致编译出错。通过虚继承的方式可以避免这种情况。

虚继承:

class B1 : virtual public A   //  其中 virtual 和 public 位置可以互换

class B2 : virtual public A

class C : public B1, public B1

// B1,B2从A中虚继承,只影响从B1,B2进一步派生的C,而对B1,B2本身没有什么影响。
// 棱形继承中,在C的构造函数的初始化列表中只需要初始化B1,B2即可
// 但是在虚继承A类之后,就必须要在C类中初始化A,否则编译报错 // 只要子类中都加virtual,A类就是虚基类

注意:

(1)如果C还有子类,则由子类来初始化A类,也就是说,虚基类是由最底层的派生类来初始化的

(2)初始化顺序,最先初始化虚基类,再按派生列表来初始化其他类,如果有多个虚基类,则按派生列表中的直接基类来追溯虚基类

(3)虚继承,子类如果有虚基类的同名成员函数,或者同名成员函数,则子类会覆盖基类的成员变量或成员函数

 

posted @ 2020-06-16 09:09  min_zhi  阅读(313)  评论(0编辑  收藏  举报