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连接
。