У меня есть базовый класс, и я не хочу делать производный класс копируемым. Чтобы все было ясно, я реализую это следующим образом:
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 некопируемым.