C++ 使用已删除的副本构造函数初始化抽象类

C++ 使用已删除的副本构造函数初始化抽象类,c++,c++11,C++,C++11,我有一个抽象类,其中包含已删除的复制构造函数和复制赋值运算符,用于作为公共接口: struct connection { // Make object non copyable. connection(const connection &) = delete; auto operator=(const connection &) -> connection & = delete; // Make class abstract.

我有一个抽象类,其中包含已删除的复制构造函数和复制赋值运算符,用于作为公共接口:

struct connection {
    // Make object non copyable.
    connection(const connection &) = delete;
    auto operator=(const connection &) -> connection & = delete;
    // Make class abstract.
    virtual ~connection() = 0;
  };
我正在尝试创建一个继承自它的类:

struct abstract_connection : connection {...};
但我在构造函数中得到以下错误:

constructor for 'abstract_connection' must explicitly initialize the base class 'connection' which does not have a default constructor

为什么在删除复制构造函数和运算符时会发生这种情况?

根据标准:

[…]如果类X没有用户声明的构造函数,则没有参数的非显式构造函数将隐式声明为default()。[……]

由于已通过删除用户声明了复制构造函数,因此需要用户提供默认构造函数:

constructor for 'abstract_connection' must explicitly initialize the base class 'connection' which does not have a default constructor
struct连接{
连接(const connection&)=删除;
自动运算符=(const connection&)->connection&=delete;
虚拟~连接()=0;
protected://您可能希望对其进行保护。
connection()=默认值;
};

根据标准:

[…]如果类X没有用户声明的构造函数,则没有参数的非显式构造函数将隐式声明为default()。[……]

由于已通过删除用户声明了复制构造函数,因此需要用户提供默认构造函数:

constructor for 'abstract_connection' must explicitly initialize the base class 'connection' which does not have a default constructor
struct连接{
连接(const connection&)=删除;
自动运算符=(const connection&)->connection&=delete;
虚拟~连接()=0;
protected://您可能希望对其进行保护。
connection()=默认值;
};

您将复制构造函数定义为您自己(=删除)。所以编译器看到了这一点,并没有生成默认构造函数。所以在这种情况下,当定义从基类连接继承的新类抽象\u连接时,编译器不知道如何为新的派生类抽象\u连接执行构造函数。所以它报告了这个错误

您将复制构造函数定义为您自己(=删除)。所以编译器看到了这一点,并没有生成默认构造函数。所以在这种情况下,当定义从基类连接继承的新类抽象\u连接时,编译器不知道如何为新的派生类抽象\u连接执行构造函数。所以它报告了这个错误

> P>特殊成员函数的自动生成背后的规则在Scott Meyers的有效C++中得到了很好的解释,第17项,第109页。 简而言之,无论何时重新定义/重写构造函数,都需要定义所有需要的构造函数。由于已删除复制构造函数,因此需要定义基类的默认构造函数。这是因为定义派生类时使用的是默认构造函数

此代码
struct抽象_连接:连接{…}
(无任何给定信息)表示您最有可能使用
连接中的默认ctor来初始化
抽象\u连接
。但是未定义连接的默认ctor

此外,您需要定义dtor,即使它是一个虚拟函数。下面的代码编译并运行


<> P>特殊的成员函数自动生成背后的规则在Scott Meyers的有效的现代C++中清晰地解释,项目17,P.109。 简而言之,无论何时重新定义/重写构造函数,都需要定义所有需要的构造函数。由于已删除复制构造函数,因此需要定义基类的默认构造函数。这是因为定义派生类时使用的是默认构造函数

此代码
struct抽象_连接:连接{…}
(无任何给定信息)表示您最有可能使用
连接中的默认ctor来初始化
抽象\u连接
。但是未定义连接的默认ctor

此外,您需要定义dtor,即使它是一个虚拟函数。下面的代码编译并运行


您需要显示更多的代码,例如何时实际实例化一个
abstract\u连接
。您需要显示更多的代码,例如何时实际实例化一个
abstract\u连接