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