Вы, безусловно, можете реализовать как конструктор копирования, так и оператор назначения копирования в производном классе, но это, вероятно, признак плохого дизайна. Возьмите этот пример:
#include <iostream>
class Base {
public:
Base() {}
private:
Base(const Base& other) {
std::cout << "Base copy constructor invoked!" << std::endl;
}
};
class Derived : public Base {
public:
Derived() {}
Derived(const Derived& other) {
std::cout << "Derived copy constructor invoked!" << std::endl;
}
};
int main(int argc, char** argv) {
Derived a;
Derived b = a;
return 0;
}
Это скомпилируется просто отлично. Однако, как и ожидалось, при запуске результирующей программы все, что печатается, это Derived copy constructor invoked!
. Когда базовый класс объявляет свой конструктор копирования / оператор копирования как закрытый, это не мешает производным классам реализовывать свои собственные версии. Он просто не позволяет производным классам вызывать версии базового класса .
И в этом заключается проблема: всегда хорошо проверять, чтобы вы скопировали все части объекта, чтобы у вас действительно было две разные копии. Часть вашего объекта включает в себя данные, принадлежащие базовому классу, поэтому вы всегда должны вызывать конструктор копирования / оператор назначения копирования, чтобы убедиться, что сделана полная копия. Но эти данные не подлежат копированию. Таким образом, невозможно скопировать все части объекта.
Это зависит от вас, если вы хотите придерживаться этого дизайна. Вы должны задать себе одну важную вещь: действительно ли ваш производный класс вообще должен быть копируемым? Если нет, то не о чем беспокоиться!