为什么为派生类定义复制构造函数需要定义基类的默认构造函数?

meg*_*ium 1 c++ constructor derived-class copy-constructor

我在单个 cpp 文件中有以下代码:

class Base
{
  public:
    //constructor
    Base() = delete;
};

class Derived : public Base
{
  public:
    //copy constructor
    Derived( const Derived & other ){};
};

int main( int argc, char* argv[] )
{
  //empty
}
Run Code Online (Sandbox Code Playgroud)

但是编译cpp文件会报错

exp.cpp:在复制构造函数'Derived::Derived(const Derived&)'中:
exp.cpp:15:37: 错误:使用已删除的函数'Base::Base()'
Derived(const Derived & other){};

exp.cpp:7:5: 注意:这里声明
Base() = delete;
^~~~

我不明白为什么。当您为派生类定义复制构造函数时,基类默认构造函数如何发挥作用?

Jea*_*nès 6

构造派生类的对象需要构造其基类的对象(因为派生实例是基实例+扩展)。

因此初始化派生实例需要初始化基实例。那么问题来了,当我为派生类调用 ctor 时,会调用基类的哪个 ctor?正如您将派生 ctor 定义为:

Derived( const Derived & other ){};
Run Code Online (Sandbox Code Playgroud)

编译器观察到您没有指定对特定基类 ctor 的调用,然后它生成对不带参数的 ctor 的调用。但是,唉,你从基类中删除了它。然后它发出一个错误。

您可能认为为派生类调用复制构造函数会生成对未删除的基类的复制构造函数的调用。但是,唉,不,规则是,如果您没有为基类指定特定的 ctor 调用,则调用没有参数的 ctor。