虚基类的构造

 如果一个类有多个基类,基类的构造函数在继承类的构造函数之前被调用。基类的构造函数以被声明的顺序被调用。下面是一个例子:

  class Y {...}
  class X : public Y {...}
  X one;

  构造函数的调用顺序是下面的顺序:

  Y(); // 基类的构造函数
  X(); // 继承类的构造函数

  对于多基类的情况,下面是一个例子:

  class X : public Y, public Z
  X one;

  构造函数以声明的次序调用。

  Y(); // 基类构造函数首先被调用
  Z();
  X();

  虚基类的构造函数在任何非虚基类构造函数前调用。如果构造中包括多个虚基类,它们的调用顺序以声明顺序为准。如果虚类是由非虚类派生而来,那非虚类的构造函数要先被调用。下面是一个例子:

  class X : public Y, virtual public Z
  X one;

  调用顺序如下:

  Z(); // 虚基类初始化
  Y(); // 非虚基类
  X(); // 继承类

  下面是一个复杂的例子:

  class base;
  class base2;
  class level1 : public base2, virtual public base;
  class level2 : public base2, virtual public base;
  class toplevel : public level1, virtual public level2;
  toplevel view;
  
  构造函数调用顺序如下:

  base(); // 虚基类仅被构造一次
  base2();
  level2(); // 虚基类
  base2();
  level1();
  toplevel();

  如果类继承中包括多个虚基类的实例,基类只被初始化一次。

 

 

在这里想补充一点,虚基类通常是为了在多继承过程中出现了菱形时,防止基类被多次构造。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值