我有一个基类,我不想让派生类可复制。为了使一切明确,我以这种方式实现它:
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)对于抽象基类,允许编译器生成特殊的成员函数,并在必要时将删除移到派生类中会更安全。