1

基本クラスのコピーコンストラクターを呼び出す場合、次の形式になります。

DerivedClass ( const DerivedClass& obj ) : BaseClass ( obj ) 
{ 
// ... 
} 

派生クラスのオブジェクトを基本クラスのコピーコンストラクターに渡す理由がわかりません。

4

4 に答える 4

2

他に何を渡したいですか?他の唯一の選択肢は、空中から想起される魔法のポニーだからです。

これは、典型的な「親への参照の背後に隠された実際の型」です。基本クラスのコピーコンストラクタには署名がありますbase(const base&)。最も派生したタイプ、半派生したタイプ、またはおそらく基本タイプを渡すかどうかは関係ありません。気になる部分、つまりbase、他には何も見えないので、適切に仕事をすることができます。

もちろん、これはパブリック継承を使用して派生した型に対してのみ機能します。これは、2つの関係を形成します。

于 2012-05-15T14:04:21.227 に答える
1

派生クラスオブジェクトへの参照が渡されているように見えますが、実際には暗黙的にアップキャストされ、基本クラスサブオブジェクトへの参照が生成されます。

事実上、引用するコードはこのコードと完全に同等です。

DerivedClass ( const DerivedClass& obj ) :
    BaseClass ( static_cast<const BaseClass&>( obj ) )
{ 
// ...

後者のコードは完全に合理的です。すでに構築されている他のオブジェクトの基本サブオブジェクトへの参照を渡すことにより、基本クラスのサブオブジェクトコンストラクターを呼び出します。

于 2012-05-15T14:05:50.777 に答える
1

派生クラスのオブジェクトには、「派生クラスのプロパティ」+「基本クラスのプロパティ」があります

派生クラスのコピーを作成する場合は、派生クラスのコピーコンストラクターを呼び出します。基本的に、「派生クラスのプロパティ」+「基本クラスのプロパティ」を新しいオブジェクトにコピーします。

派生クラスのプロパティのコピーは、派生クラスのコピーコンストラクターによって処理されます。基本クラスのプロパティをコピーするには、基本クラスのコピーコンストラクターを明示的に呼び出す必要があります。

于 2012-05-15T14:24:46.623 に答える
0

そうしなかった場合、基本クラスは何からコピーしますか?

ADerivedClass はa BaseClassであるため、aへの参照に暗黙的にキャストし、コピー元のコピーコンストラクターBaseClassで使用できます。BaseClass

したがってBaseClass(const BaseClass&)、のメンバーのコピーを処理し、のメンバーのコピーを処理しBaseClassます。DerivedClass(const DerivedClass&)DerivedClass

このようにすることで、BaseClassコピーコンストラクターにあるコピーコードを、それから派生するすべてのクラスで複製することを回避し、基本クラスが変更されたときに破損することを回避できます。

于 2012-05-15T14:03:01.547 に答える