虚继承中的构造函数的调用

写出下面程序的输出:

class A{

public:

     char c1;

     A(){c1='A';}

     A(char c1){this->c1=c1;}

};

class B:public virtual A{

public:

     char c2;

B(){c2='B';}

B(char c1,char c2):A(c1){this->c2=c2;}

};

class C:public virtual A{

public:

     char c3;

     C(){c3='C';}

     C(char c1,char c3):A(c1){this->c3=c3;}

};

class D:public B,public C{

public:

      char c4;

      D(){c3='D';}

      D(char c1,char c2,char c3,char c4):B(c1,c2),C(c3,c3){this->c4=c4;}

};

D obj('a','b','c','d');

cout<<obj.c1<<obj.c2<<obj.c3<<obj.c4<<endl;

  • 虚继承保证继承关系中的虚基类只被初始化一次;
  • 在菱形继承中,底层类的构造函数初始化列表中会首先调用顶层类的构造函数,如果底层类的初始化列表中没有显示调用顶层类的构造函数,编译器会自动调用顶层类的无参构造函数。因此类D的构造函数等价于:
  • D(char c1,char c2,char c3,char c4):A(),B(c1,c2),C(c3,c3).
  • 因此,程序输出为Abcd。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值