Вы не можете запретить дочернему классу определять собственный конструктор копирования / перемещения. Тем не менее, это предотвратит его «из коробки», то есть если вы его не предоставите или используете встроенный конструктор по умолчанию, он также будет помечен как удаленный. Причина, по которой вы получаете ошибку здесь, когда вы пытаетесь просто определить конструктор по умолчанию, заключается в том, что вам не разрешено делать это во внешнем определении, когда член или база неявно удалили его. Если бы вы использовали
class DerivedClass : public BaseClass {
public:
DerivedClass(const DerivedClass &) = default;
bool doSomething() override;
};
тогда код скомпилируется, и вы получите ошибку только в том случае, если попытаетесь вызвать конструктор копирования. Это работает, потому что встроенное неявное значение по умолчанию разрешено, даже если член или база неявно удаляют его, а конечным результатом является то, что конструктор неявно удаляется.