我有一个基类,并且我不想使派生类可复制。为了使所有内容都明确,我以这种方式实现它:

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/

10-13 07:04