5

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

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

4

1 回答 1

6

不,这是完全不正确的。

首先,在您使派生类不可复制的过程中,您已使其不可移动,这使其几乎无用。

其次,根本没有理由让 A 不可复制。如果需要,每个派生类都可以使自己不可复制。A 已经是抽象的并且不能被切片,所以没有理由使 A 不可复制。

于 2015-09-13T10:24:35.817 回答