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

Why does defining a copy constructor for derived class requires that the default constructor for base class be defined?

我在单个 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
}

但是编译cpp文件出错

exp.cpp: In copy constructor ‘Derived::Derived(const Derived&)’:
exp.cpp:15:37: error: use of deleted function ‘Base::Base()’
Derived( const Derived & other ){};

exp.cpp:7:5: note: declared here
Base() = delete;
^~~~

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

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

因此初始化派生实例需要初始化基础实例。那么问题是,当我为派生 class 调用一个构造函数时,调用了基 class 的哪个构造函数?正如您将派生 ctor 定义为:

Derived( const Derived & other ){};

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

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