当我有一个虚方法时,构造函数被编译器删除了?
我遇到了可以在以下代码片段中总结的情况。基本上,我希望我的类继承构造函数。它可以工作,但是一旦我在C. 显然编译器删除了构造函数。
我的问题是:
- 编译器为什么要这样做?
- 我可以通过在 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无需使用聚合初始化即可构造。