在数字化转型中,选择合适的跨平台开发框架不仅能提高效率,还有助于确保数据安全与合规性。
1006
2022-10-03
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 执行结果 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 注意 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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~