我在单个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文件会导致错误



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

最佳答案

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

因此,初始化派生实例必须初始化基本实例。问题是,当我为派生类调用ctor时,将调用基类的ctor吗?当您将派生的ctor定义为:

Derived( const Derived & other ){};

编译器发现您没有指定对特定基类ctor的调用,然后编译器生成了不带参数的对ctor的调用。但是,a,您从基类中将其删除。然后发出一个错误。

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

关于c++ - 为什么为派生类定义拷贝构造函数要求定义基类的默认构造函数?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59608913/

10-14 09:36