了解零规则
Understanding rule of zero
我有一个基 class,我不想使派生 class 可复制。为了使一切明确,我以这种方式实现它:
class A {
public:
A() = default;
virtual ~A() = default;
A(const A&) = delete;
A(const A&&) = delete;
A& operator=(const A&) = delete;
A& operator=(const A&&) = delete;
virtual void vFun() = 0;
};
class B : public A {
public:
B() = default;
virtual ~B() = default;
B(const B&) = delete;
B(const B&&) = delete;
B& operator=(const B&) = delete;
B& operator=(const B&&) = delete;
virtual void vFun() override {}
};
这是做这些事情的正确方法吗?根据我的知识和阅读的内容,答案是肯定的,但我想在将其引入生产系统之前确定一下。
编辑
总结一下:
1) 几乎总是移动操作符不应该被删除。那是因为"there's an infinity of things that require movability"。
2) 对于抽象基 class,允许编译器生成特殊成员函数,如果有必要,将删除移至派生 class 更安全。
不,这是完全错误的。
首先,在您使派生的 class 不可复制的过程中,您已将其设为不可可移动,这使得它几乎毫无用处。
其次,A 根本没有理由不可复制。每个派生的 class 都可以根据需要使自己不可复制。 A 已经是抽象的,不能被切片,所以没有理由使 A 不可复制。
我有一个基 class,我不想使派生 class 可复制。为了使一切明确,我以这种方式实现它:
class A {
public:
A() = default;
virtual ~A() = default;
A(const A&) = delete;
A(const A&&) = delete;
A& operator=(const A&) = delete;
A& operator=(const A&&) = delete;
virtual void vFun() = 0;
};
class B : public A {
public:
B() = default;
virtual ~B() = default;
B(const B&) = delete;
B(const B&&) = delete;
B& operator=(const B&) = delete;
B& operator=(const B&&) = delete;
virtual void vFun() override {}
};
这是做这些事情的正确方法吗?根据我的知识和阅读的内容,答案是肯定的,但我想在将其引入生产系统之前确定一下。
编辑
总结一下: 1) 几乎总是移动操作符不应该被删除。那是因为"there's an infinity of things that require movability"。 2) 对于抽象基 class,允许编译器生成特殊成员函数,如果有必要,将删除移至派生 class 更安全。
不,这是完全错误的。
首先,在您使派生的 class 不可复制的过程中,您已将其设为不可可移动,这使得它几乎毫无用处。
其次,A 根本没有理由不可复制。每个派生的 class 都可以根据需要使自己不可复制。 A 已经是抽象的,不能被切片,所以没有理由使 A 不可复制。