基本クラスのコピーコンストラクターを呼び出す場合、次の形式になります。
DerivedClass ( const DerivedClass& obj ) : BaseClass ( obj )
{
// ...
}
派生クラスのオブジェクトを基本クラスのコピーコンストラクターに渡す理由がわかりません。
基本クラスのコピーコンストラクターを呼び出す場合、次の形式になります。
DerivedClass ( const DerivedClass& obj ) : BaseClass ( obj )
{
// ...
}
派生クラスのオブジェクトを基本クラスのコピーコンストラクターに渡す理由がわかりません。
他に何を渡したいですか?他の唯一の選択肢は、空中から想起される魔法のポニーだからです。
これは、典型的な「親への参照の背後に隠された実際の型」です。基本クラスのコピーコンストラクタには署名がありますbase(const base&)
。最も派生したタイプ、半派生したタイプ、またはおそらく基本タイプを渡すかどうかは関係ありません。気になる部分、つまりbase
、他には何も見えないので、適切に仕事をすることができます。
もちろん、これはパブリック継承を使用して派生した型に対してのみ機能します。これは、2つの関係を形成します。
派生クラスオブジェクトへの参照が渡されているように見えますが、実際には暗黙的にアップキャストされ、基本クラスサブオブジェクトへの参照が生成されます。
事実上、引用するコードはこのコードと完全に同等です。
DerivedClass ( const DerivedClass& obj ) :
BaseClass ( static_cast<const BaseClass&>( obj ) )
{
// ...
後者のコードは完全に合理的です。すでに構築されている他のオブジェクトの基本サブオブジェクトへの参照を渡すことにより、基本クラスのサブオブジェクトコンストラクターを呼び出します。
派生クラスのオブジェクトには、「派生クラスのプロパティ」+「基本クラスのプロパティ」があります
派生クラスのコピーを作成する場合は、派生クラスのコピーコンストラクターを呼び出します。基本的に、「派生クラスのプロパティ」+「基本クラスのプロパティ」を新しいオブジェクトにコピーします。
派生クラスのプロパティのコピーは、派生クラスのコピーコンストラクターによって処理されます。基本クラスのプロパティをコピーするには、基本クラスのコピーコンストラクターを明示的に呼び出す必要があります。
そうしなかった場合、基本クラスは何からコピーしますか?
ADerivedClass
はa BaseClass
であるため、aへの参照に暗黙的にキャストし、コピー元のコピーコンストラクターBaseClass
で使用できます。BaseClass
したがってBaseClass(const BaseClass&)
、のメンバーのコピーを処理し、のメンバーのコピーを処理しBaseClass
ます。DerivedClass(const DerivedClass&)
DerivedClass
このようにすることで、BaseClass
コピーコンストラクターにあるコピーコードを、それから派生するすべてのクラスで複製することを回避し、基本クラスが変更されたときに破損することを回避できます。