理解零规则

时间:2015-09-13 10:07:44

标签: c++ c++11 rule-of-zero

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

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)对于抽象基类,允许编译器生成特殊成员函数更安全,如果存在必要,则将删除移动到派生类中。

1 个答案:

答案 0 :(得分:6)

不,这完全是错误的。

首先,在你要求派生类不可复制的过程中,你已经使它成为非可移动的,这使它几乎无用。

其次,A根本没有理由不可复制。如果需要,每个派生类都可以使自己不可复制。 A已经是抽象的,无法切片,因此没有理由使A不可复制。