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

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

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) Для абстрактного базового класса безопаснее позволить компилятору сгенерировать специальную функцию-член и перенести удаление в производный класс, если такая необходимость существует.

5

Решение

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

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

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

6

Другие решения


По вопросам рекламы [email protected]