如何使用抽象基直接初始化派生类?

Spo*_*man 1 c++ c++20

如果没有虚拟方法,则该make_unique行可以main编译正常。但我不知道如何Derived在它存在时直接初始化这样的东西。这可能吗?

struct Base
{
    virtual void method();
};
struct Derived : public Base
{
    int i;
};

int main() {
    Base base{}; // this works
    make_unique<Derived>(Base{}, 3); // this doesn't compile unless the virtual method is removed
}
Run Code Online (Sandbox Code Playgroud)

我在“直接初始化”页面中没有看到任何提及虚拟方法:https://en.cppreference.com/w/cpp/language/direct_initialization

Ted*_*gmo 6

使用该virtual方法,您的Derived类不再是聚合,因此无法完成这种形式的初始化。

来自cppreference

聚合是以下类型之一:

  • 数组类型
  • 类类型(通常struct为 或union),具有
    • 没有用户声明的构造函数(C++11 之前)
    • 没有用户提供的、继承的或显式构造函数 (C++11 起)(C++20 之前)
    • 没有用户声明或继承的构造函数 (C++20 起)
    • 没有私有或受保护的[直接 (C++17 起)] 非静态数据成员
    • 无基类(C++17 之前)
    • 无虚拟基类 (C++17 起)
    • 没有私有或受保护的直接基类 (C++17 起)
    • 没有虚拟成员函数
    • 无默认成员初始值设定项(自 C++11 起)(直到 C++14)

  • @Spongman 有时,一些限制可能看起来是人为的,但它们通常是为了覆盖一些极端情况。直到 C++17 聚合才可以拥有基类。 (3认同)
  • “虚拟”方法中存在一些奇怪且特定于实现的东西,标准化机构可能不想破坏这些东西。 (3认同)