如果我有一个抽象基类,并且我想让所有派生类不可复制和不可移动,那么声明这些在基类中删除的特殊成员函数就足够了吗?我想确保我的整个类层次结构是不可复制和不可移动的,并且想知道是否可以不必在每个派生类中将这 4 个特殊成员函数声明为已删除。我看到了一个 SO 答案,它似乎暗示派生类可以显式声明复制或移动构造函数,尽管已从基类中删除,但是当我尝试定义默认的复制赋值运算符时,以下示例会导致编译错误,所以我我不确定。这是错误:
derived_class.cc:15:15:错误:默认此复制构造函数将在其第一次声明后将其删除 DerivedClass::DerivedClass(const DerivedClass &) = default;
derived_class.h:9:22:注意:“DerivedClass”的复制构造函数被隐式删除,因为基类“virtual_functions::BaseClass”有一个已删除的复制构造函数类 DerivedClass:public BaseClass {
base_class.h:11:3:注意:'BaseClass' 已在此处明确标记为已删除 BaseClass(const BaseClass &) = delete;
// base_class.h
class BaseClass {
public:
BaseClass(const BaseClass &) = delete;
BaseClass(BaseClass &&) = delete;
BaseClass &operator=(const BaseClass &) = delete;
BaseClass &operator=(BaseClass &&) = delete;
virtual ~BaseClass() = default;
virtual bool doSomething() = 0;
protected:
BaseClass(std::string name);
private:
std::string name_;
};
// derived_class.h
class DerivedClass : public BaseClass {
public:
DerivedClass();
DerivedClass(const DerivedClass &);
bool doSomething() override;
};
// derived_class.cc
DerivedClass::DerivedClass(const DerivedClass &) = default;