Я хочу реализовать конструктор копирования в следующем классе A, который содержит указатель на полиморфный класс реализации Base. В настоящее время у меня есть виртуальный метод create_copy() в классе Base, который необходимо переопределить производным классам. Тем не менее, переопределения для производных классов используют один и тот же код. Я пропустил более простой способ копирования объектов типа A? И действительно ли мне нужно копировать тот же самый код для каждого производного класса? Ниже приводится то, что я использую сейчас. В случае изменения ответа требуется полиморфизм времени выполнения.Как обобщать конструктор копирования для производных классов?
class A {
public:
A(const A& a): base_p {a.base_p->create_copy()} {}
private:
unique_ptr<Base> base_p;
};
class Base {
public:
virtual unique_ptr<Base> create_copy() const;
};
class Derived : public Base {
public:
unique_ptr<Base> create_copy() const override {
return make_unique<Derived>(*this);
}
};
Одна из идей, я был связан с использованием какой-то код, как:
return make_unique<remove_reference_t<decltype(*this)>>(*this);
Однако этот код не работает в константной функции члена. Также я думаю, что мне все равно придется явно переопределять метод create_copy() в каждом производном классе, так как decltype (* this) оценивается во время компиляции, и поэтому включение этого кода в метод базового класса не принесет мне никакой пользы.
EDIT: Ответ на вопрос Inheritance in curiously recurring template pattern polymorphic copy (C++) более сложный, чем то, что мне нужно. У меня есть простая иерархия наследования глубины 1, которую никогда не нужно расширять до большей глубины. Ответ Иорро вместе с предоставленной связью был достаточным для решения моей проблемы.
Возможно, вас заинтересует [это сообщение] (https://stackoverflow.com/questions/196733/how-can-i-use-covariant-return-types-with-smart-pointers) – CoryKramer
Возможный дубликат [ Наследование в любопытно повторяющейся шаблонной полиморфной копии шаблона (C++)] (http://stackoverflow.com/questions/9422760/inheritance-in-curiously-recurring-template-pattern-polymorphic-copy-c) –
Нужен ли дизайн 'unique_ptr', где содержимое клонируется при каждой копии!? –