当我有一个虚方法时,构造函数被编译器删除了?

我遇到了可以在以下代码片段中总结的情况。基本上,我希望我的类继承构造函数。它可以工作,但是一旦我在C. 显然编译器删除了构造函数。

我的问题是:

  1. 编译器为什么要这样做?
  2. 我可以通过在 B 和 C 中定义构造函数并最终委托给 A 的构造函数来解决。有一个更好的方法吗?
#include <iostream>

struct A {
  A() = delete;
  A(int x) : x_(x) {}
  int x_;
};

struct B : public A {
};

struct C : public B {
  // What? defining virtual method kills the inherited constructor
  //virtual void foo() {}
};

int main() {
  C c{10};
  std::cout << "Hello World: " << c.x_ << std::endl;
}

回答

只有当您显式声明继承的构造函数时,构造函数才会被继承。这是按如下方式完成的:

struct B : public A {
    using A::A;
};

struct C : public B {
    using B::B;
};

在您的程序中,您没有使用继承的构造函数;您正在使用聚合初始化。添加虚函数C不再是聚合,因此不能使用聚合初始化。如果声明继承的构造函数,则C无需使用聚合初始化即可构造。


以上是当我有一个虚方法时,构造函数被编译器删除了?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>