Понимание правила нуля

У меня есть базовый класс, и я не хочу делать производный класс копируемым. Чтобы все было ясно, я реализую это следующим образом:

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 ответ

Решение

Нет, это совершенно неверно.

Во-первых, в своем стремлении сделать производный класс некопируемым, вы сделали егонеподвижным, что делает его практически бесполезным.

Во-вторых, нет никаких причин, по которым А вообще не может быть скопирован. Каждый производный класс может просто сделать себя некопируемым, если захочет. A уже абстрактна и не может быть разрезана, поэтому нет никаких причин делать A некопируемым.

Другие вопросы по тегам