我有一个基类,并且我不想使派生类可复制。为了使所有内容都明确,我以这种方式实现它:
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)不应删除几乎总是移动的运算符。这是因为“存在无限的需要可移动性的事物”。
2)对于抽象基类,允许编译器生成特殊的成员函数,并在存在这种必要的情况下将删除操作移到派生类中,这是更安全的方法。
最佳答案
不,这是完全不正确的。
首先,在您试图使派生类不可复制的过程中,您使其变为不可移动的,这使其几乎无用。
其次,完全没有理由说A是不可复制的。如果需要,每个派生类都可以使其自身不可复制。 A已经是抽象的并且不能被切片,因此没有理由将A设为不可复制。
关于c++ - 了解零规则,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32548531/