ctorと割り当てをプライベートにする(またはそれらをC ++ 11で= deleteと宣言する)ことで、コピーを無効にします。
ここでのポイントは、それを行う必要がある場所です。コードを維持するために、IAbstractは問題になりません。(あなたがしたことをすることに注意してください、あなたは*a1 IAbstractサブオブジェクトをa2に割り当て、への参照を失いますDerived。値の割り当ては多態的ではありません)
問題が付属していDerived::theproblemます。Derivedを別のDerivedにコピーすると、実際には、共有する*theproblemように設計されていない可能性のあるデータが共有される場合があります(delete theproblemデストラクタを呼び出す可能性のあるインスタンスが2つあります)。
その場合は、Derivedコピー不可で割り当て不可でなければなりません。もちろん、でコピーをプライベートにするIAbstractと、のデフォルトのコピーでDerived必要になるため、コピーDerivedもできなくなります。しかし、copy Derived::Derived(const Derived&)を呼び出さずに独自に定義した場合IAbtractでも、それらをコピーできます。
問題はDerivedにあり、ソリューションはDerivedにとどまる必要があります。それがポインターまたは参照によってのみアクセスされる動的のみのオブジェクトでなければならない場合、それはDerived自体でなければなりません。
class Derived
{
...
Derived(const Derived&) = delete;
Derived& operator=(const Derived&) = delete;
};
基本的に、Derivedクラスの設計者(Derivedがどのように機能し、どのようtheproblemに管理されるかを知っている必要があります)が、割り当てとコピーで何を行うかを決定します。