2

假设我有一个名为File. File例如,我想为 的每个儿子禁用复制构造函数TextFile

做这样的事情仍然会禁用复制构造函数TextFile吗?

class File {
public:
    File(const File& f) = delete;
};

class TextFile:public File {
public:
};

或者为了禁用它是否有必要?

class File {
public:
    File(const File& f) = delete;
};

class TextFile:public File {
public:
    TextFile(const TextFile& tf) = delete;
};
4

2 回答 2

4

您的第一个代码块就是您所需要的。由于File在编译器生成复制构造函数时不可复制,因为TextFile它会看到并隐式删除它,因为它不能生成合法的复制构造函数。

但它没有做的是阻止您在派生类中创建自己的复制构造函数。如果您对此感到满意,那么这就是您所需要的。

于 2019-09-18T12:55:47.007 回答
2

派生类的复制构造函数也在第一个代码片段中被隐式删除。

来自 C++ 17 标准(15.8.1 复制/移动构造函数)

10 隐式声明的复制/移动构造函数是其类的内联公共成员。如果 X 具有以下属性,则类 X 的默认复制/移动构造函数被定义为已删除 (11.4.3):

(10.1) — 一个潜在构造的子对象类型 M(或其数组),它不能被复制/移动,因为重载决议 (16.3) 用于查找 M 的相应构造函数会导致歧义或函数被删除或无法从默认构造函数,

但是对于代码的自我记录,您可以在派生类中明确指定删除复制构造函数。

于 2019-09-18T12:55:30.933 回答