By making ctor and assignment private (or by declaring them as =delete in C++11) you disable copy.
The point here is WHERE you have to do that.
To stay with your code, IAbstract is not an issue.
(note that doing what you did, you assign the
IAbstract subobject to a2, loosing any reference to
Derived. Value assignment is not polymorphic)
The issue comes with
Copying a Derived into another may in fact share the
*theproblem data that may be not designed to be shared (there are two instances that may call
delete theproblem in their destructor).
If that's the case, it is
Derived that must be non-copyable and not assignable.
Of course, if you make private the copy in
IAbstract, since the default copy for
Derived needs it,
Derived will also be not copyable.
But if you define your own
Derived::Derived(const Derived&) without calling
IAbtract copy, you can still copy them.
The problem is in Derived, and the solution must stay into Derived: if it must be a dynamic-only object accessed only by pointers or references, it is Derived itself that must have
Derived(const Derived&) = delete;
Derived& operator=(const Derived&) = delete;
Essentially it is up to the designer of the Derived class (that should know how Derived works and how
theproblem is managed) to decide what to do with assignment and copy.