2016-11-17 9 views
1

私は継承のコンテキストでコンストラクタのコンセプトに苦労してきました。この混乱は、C + 11でこのトピックに大きな変化がもたらされた(つまり、ベースコンストラクタは継承できますか?)という事実によって複雑になりました。継承チェーンはコンストラクタ呼び出しのチェーンを作成しますか?

だから私の質問:

私は、コンストラクタの継承を使用しますが、ちょうど私の派生クラスで新しいコンストラクタを定義しないと仮定するが、基本コンストラクタがまだ呼び出されるのでしょうか?すべきではないようですが、私はいくつかの文書を見てきました。さらに、継承チェーンがある場合、一連のコンストラクタが呼び出されますか?もしそうなら、どのような順序で?派生前のベース、またはベースより前に派生したベース?

ありがとうございました!ここで

+0

'super()'を呼び出さない限り、答えは_no_だと私は信じています。 –

+1

@ EricM。それはコンパイルされないので、答えは 'super()'でまだnoです。 –

+0

LOL!私はそれがjavaで動作していることを知っていた...私は60%、おそらく70%それはCで働いていた+ +。 TIL。 –

答えて

2

は順序です:派生ため

  1. メモリは
  2. (ベースと 派生部分の両方のための十分な)別に設定されている。ここで

    は派生がインスタンス化されるときに実際に何が起こるかです適切なDerivedコンストラクタは、

  3. と呼ばれます。Baseオブジェクトは、最初に適切なBaseコンストラクタを使用して構築されます。基本コンストラクタが指定されていない場合、デフォルトの コンストラクタが使用されます。
  4. コントロールが呼び出し元に返される初期化リストは、変数
  5. を初期化するコンストラクタの本体は
  6. 実行

はそれがお役に立てば幸いです。

+1

手順2と3を説明してください。手順2で、派生コンストラクタが呼び出されたとし、手順3で「基本オブジェクトが最初に適切な基本コンストラクタを使用して構築された」と言います。最初に何が呼ばれたのですか? – Izzo

+0

私が知っているように、派生したコンストラクタが何かを実質的に行うことができる前に、Baseコンストラクタが最初に呼び出されます。 BaseコンストラクタはオブジェクトのBase部分を設定し、コントロールはDerivedコンストラクタに返され、Derivedコンストラクタはそのジョブを終了することができます。 – GAVD

+0

手順2と手順5の違いは何ですか?コンストラクタが本体を実行しない場合、コンストラクタを呼び出すとはどういう意味ですか? – Barmar

関連する問題