Зробивши ctor і призначення приватними (або оголосивши їх як = видалити в C ++ 11), ви відключите копію.
Суть у тому, де вам це потрібно зробити. Залишатися зі своїм кодом IAb Abstract не є проблемою. (зауважте, що, зробивши те, що ви зробили, ви присвоюєте *a1
IAbstract
субект a2, втрачаючи будь-яку посилання на Derived
. Присвоєння значення не є поліморфним)
Питання постає з Derived::theproblem
. Копіювання отриманого в інший може насправді ділитись *theproblem
даними, які можуть не бути призначеними для спільного доступу (є два екземпляри, які можуть викликати delete theproblem
у своєму деструкторі).
Якщо це так, воно Derived
повинно бути не копіюваним і не присвоюватися. Звичайно, якщо ви зробите приватну копію IAbstract
, оскільки копія за замовчуванням Derived
потрібна, Derived
вона також не підлягає копіюванню. Але якщо ви визначите свої, Derived::Derived(const Derived&)
не викликаючи IAbtract
копії, ви все одно можете скопіювати їх.
Проблема в Derived, і рішення повинно залишатися в Derived: якщо він повинен бути лише динамічним об'єктом, до якого звертаються лише вказівники або посилання, він повинен бути отриманий самим
class Derived
{
...
Derived(const Derived&) = delete;
Derived& operator=(const Derived&) = delete;
};
По суті, theproblem
вирішувати, що робити із завданням та копією, вирішувати дизайнер класу Derived (той, хто повинен знати, як Derived працює і як керується).