我有一个基类,我不想让派生类可复制。为了使一切都明确,我以这种方式实现它:
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)对于抽象基类,允许编译器生成特殊成员函数更安全,如果存在必要,则将删除移动到派生类中。
答案 0 :(得分:6)
不,这完全是错误的。
首先,在你要求派生类不可复制的过程中,你已经使它成为非可移动的,这使它几乎无用。
其次,A根本没有理由不可复制。如果需要,每个派生类都可以使自己不可复制。 A已经是抽象的,无法切片,因此没有理由使A不可复制。