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
に管理されるかを知っている必要があります)が、割り当てとコピーで何を行うかを決定します。