Делая ctor и присваивание частным (или объявляя их как = delete в C ++ 11), вы отключаете копирование.
Дело в том, ГДЕ вы должны это сделать. Чтобы остаться с вашим кодом, IAbstract не является проблемой. (обратите внимание, что делая то, что вы сделали, вы назначаете *a1 IAbstractподобъект a2, теряя все ссылки на Derived. Присвоение значения не является полиморфным)
Проблема идет с Derived::theproblem. Копирование производного в другое может фактически делиться *theproblemданными, которые могут быть не предназначены для совместного использования (есть два экземпляра, которые могут вызывать delete theproblemих деструктор).
Если это так, то Derivedэто должно быть не подлежащим копированию и не подлежащим назначению. Конечно, если вы делаете закрытую копию IAbstract, так как Derivedона нужна по умолчанию , Derivedона также не будет копироваться. Но если вы определяете свое собственное Derived::Derived(const Derived&)без вызова IAbtractcopy, вы все равно можете копировать их.
Проблема в Derived, и решение должно оставаться в Derived: если это должен быть динамический объект, доступ к которому есть только по указателям или ссылкам, то это должен быть сам Derived, который должен иметь
class Derived
{
...
Derived(const Derived&) = delete;
Derived& operator=(const Derived&) = delete;
};
По сути, именно разработчик класса Derived (который должен знать, как работает Derived и как theproblemуправляется), должен решить, что делать с назначением и копированием.