【问题标题】:Virtual baseclass calls empty constructor in C++ (C++11)虚拟基类在 C++ (C++11) 中调用空构造函数
【发布时间】:2013-06-27 03:58:13
【问题描述】:

让我们看看下面的代码:

class A{
protected:
  int _val;
public:
  A(){printf("calling A empty constructor\n");}
  A(int val):_val(val){printf("calling A constructor (%d)\n", val);}
};

class B: virtual public A{
public:
  B(){printf("calling B empty constructor\n");}
  B(int val):A(val){printf("calling B constructor (%d)\n", val);}
};

class C: public B{
public:
  C(){printf("calling C empty constructor\n");}
  C(int val):B(val){printf("calling C constructor (%d)\n", val);}
};

int main(void) {
  C test(2);
}

输出是:

calling A empty constructor
calling B constructor (2)
calling C constructor (2)

有人可以向我解释为什么在没有任何参数的情况下调用 A 类构造函数吗? 另外,如果我希望 B 类虚拟地从 A 继承,我该如何“修复”这种行为? (如果继承不是虚拟的 - 示例工作正常)

【问题讨论】:

  • 这不是被讨论死了吗?
  • 继承中的关键字virtual 总是使构造函数调用基类的默认构造函数,即使您在声明中指定了非默认构造函数,基于基类将在继承树中显示多次,您只希望构造函数被调用一次。另请注意,无论您指定的顺序如何,虚拟继承的默认构造函数都会在正常继承之前调用。

标签: c++ class inheritance c++11 base-class


【解决方案1】:

在 c++03 中也是一样的。

虚拟基础构造函数总是从最终叶类调用。 如果您在实例化 C 时想要 A 的默认构造函数以外的其他内容,则您也必须在 C 类的构造函数中指定它。

C(int val): A(val), B(val) {printf("calling C constructor (%d)\n", val);}

【讨论】:

    猜你喜欢
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2013-03-24
    • 2021-04-15
    • 2011-09-21
    • 2011-03-30
    • 1970-01-01
    相关资源
    最近更新 更多