C++ 虚继承派生类构造函数的写法

网友投稿 952 2022-10-03

C++ 虚继承派生类构造函数的写法

C++ 虚继承派生类构造函数的写法

昨天做题时候发现的问题

普通的继承中,我们可以在当前类(C)构造函数的初始化表中指明如何去构造直接父类(B),然后在该父类(B)构造函数的初始化表中指明如何构造祖先类(A)。

示例代码

class A{public: A() {} A(int d):data(d) {}private: int data;};class B : public A{public: B() {} B(int x):A(x) {}};class C : public B{public: C() {} C(int

这样的写法是正确的,在创建一个 C 类型的实例时,程序会根据其构造函数的选择以及参数化表层层找到最上层的类,然后依次往下执行构造函数进行初始化。

但是在继承链中如果存在虚继承的话或许就不是这样了。

程序中有四个类: ​​animal、aqu_animal、amp_animal、test​​

其中类之间的继承关系如下,除 ​​test​​ 以外其他继承都采用虚继承的方式。

示例代码

这里还是按照原来的思路进行初始化的工作

#include #includeusing namespace std;class animal{protected: int height; int weight; char sex;public: animal() { cout<<"animal()"<

执行结果

animal()aqu_animal()amp_animal(int h,int w,char s,int s_p,int r)test(int h,int w,char s,int s_p,int r)----------------height:4309616weight:7012244sex:swimming_speed:1978756045running_speed:120

可以看到,除了 ​​running_speed​​ 正常外其他的变量都没有被正常赋值。

在函数的调用中,我们发现 ​​test​​​ 类中的 ​​test(int h,int w,char s,int s_p,int r)​​​ 正常执行了,并且它所附带的初始化表中的构造函数同样也被执行了( ​​amp_animal(int h,int w,char s,int s_p,int r)​​ )。

而在 ​​amp_animal​​​ 类中利用 ​​amp_animal(int h,int w,char s,int s_p,int r)​​​ 构造时的父类 ​​aqu_animal​​​ 构造函数 ​​aqu_animal(int h,int w,char s,int s_p)​​​ 并没有被执行,同样 ​​animal​​​ 类中的 ​​animal(int h,int w,char s)​​ 也没有被执行,实际上都是调用了它们缺省的构造函数。

原因以及解决方法

在 ​​C++​​ 中,如果继承链上存在虚继承的基类,则最底层的子类要负责完成该虚基类部分成员的构造。

即我们需要显式调用虚基类的构造函数来完成初始化,如果不显式调用,则编译器会调用虚基类的缺省构造函数,若虚基类中没有定义的缺省构造函数,则会编译错误。

因为如果不这样做,虚基类部分会在存在的多个继承链上被多次初始化。

很多时候,对于继承链上的中间类,我们也会在其构造函数中显式调用虚基类的构造函数,因为一旦有人要创建这些中间类的对象,我们要保证它们能够得到正确的初始化。

改法

#include #includeusing namespace std;class animal{protected: int height; int weight; char sex;public: animal() { cout<<"animal()"<

注意 ​​test​​ 的构造函数初始化表中我们显式的调用了其间接父类的构造函数。

执行结果

animal(int h,int w,char s)aqu_animal(int h,int w,char s,int s_p)amp_animal(int h,int w,char s,int s_p,int r)test(int h,int w,char s,int s_p,int r)----------------height:50weight:20sex:mswimming_speed:100running_speed:120

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:POJ 3422 Kaka's Matrix Travels (最小费用流)
下一篇:怎么链接到小程序页面(怎么链接到小程序页面打开)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~