C++虚基类初始化
Posted Linux编程学堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++虚基类初始化相关的知识,希望对你有一定的参考价值。
2 虚基类的初始化
如果在虚基类中定义了带参数的构造函数,而且没有定义默认构造函数,则在其所有派生类(包括直接派生或间接派生的派生类)中,通过构造函数的初始化表对虚基类进行初始化。例如:
class X //定义基类X
X(int i) //基类构造函数,有一个参数
...
...
;
class A : virtual public X // X 作为A 的虚基类
A(int n) : X(n) //A类构造函数,在初始化列表中对虚基类初始化
...
...
;
class B : virtual public X // X 作为B 的虚基类
B(int n) : X(n) //B类构造函数,在初始化列表中对虚基类初始化
...
...
;
class C : public A, public B
C(int n): A(n), B(n), X(n) //类C的构造函数,在初始化列表中对所有基类(包括基类X)初始化
...
...
;
注意:定义派生类C的时候,从基类A,基类B派生而来。那么,基类A,基类B是虚基类。所以,在派生类C中只有一份基类X的代码。
所以,也需要在派生类C中对虚基类进行“初始化”。测试代码如下:
程序运行结果如下:
可以看到,在派生类C的构造函数中,也对基类X进行初始化。在虚基类A,B的构造函数中,也对基类X进行初始化。最终,只调用基类X的构造函数一次。
如果不在派生类C的构造函数中对基类X进行初始化,需要给基类X定义一个无参构造函数。而且,虚基类A,B的的构造函数中,即使调用了基类X的构造函数,还是无法调用基类X的构造函数。测试代码如下:
程序运行结果如下:
可以看到,在派生类C的构造函数中,没有对基类X进行初始化。即使在虚基类A,B中对基类X进行初始化,还是没有调用基类X对应的构造函数。最终,默认调用基类X的无参构造函数。
所以,定义虚基类的时候,需要注意底层基类的初始化。需要在最终的派生类中对底层的基类进行初始化。
以上是关于C++虚基类初始化的主要内容,如果未能解决你的问题,请参考以下文章