Зробивши 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 працює і як керується).