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++虚基类初始化的主要内容,如果未能解决你的问题,请参考以下文章

C++不是说虚基类构造函数只被调用一次吗?

C++学习20 虚基类详解

C++ 类的继承五(多继承的二义性--虚基类)

C++ ——虚继承时的构造函数

C++ ——虚继承时的构造函数

C++ 继承和多态