2017-10-27 6 views
1

私はこの小さなプログラムを書いて、私の理解をテストしました。理解がうまくいかないのは、コンストラクタは継承されないが、クラスBはクラスAのコンストラクタを呼び出すことができるということです。C++の基本クラスのコンストラクタ

#include <iostream> 
using namespace std; 

class A { 
public: 
    A(int x = 2) {   //Constructor A 
     num = x; 
    } 
    int getNum() { 
     return num; 
    } 

protected: 
    int num; 
}; 

class B: public A {   //Constructor B 
public: 
    B() { 
     A(5); 
    } 
}; 

int main() { 

    A a(3);      //create obj a with num = 3 
    B b;      //create obj b 
    cout << a.getNum() << endl; 
    cout << b.getNum() << endl; 
    return 0; 
} 

出力は次のようになります。

3 
2 

コンストラクタAの呼び出しは正確に何をしたのですか?渡された引数を使用してオブジェクトbの番号を初期化しませんでした。

さらに、私はクラスAのコンストラクタからデフォルト値を削除した場合、私はコンパイルエラーを取得:

no matching function for call to 'A::A()' 

だから何が正確にここに起きているのでしょうか?出力できます

class B: public A {   //Constructor B 
public: 
    B() : A(5) { 
    } 
}; 

私は正しい方法がそうであることを知っている

3 
5 

をしかし、これは単に理解するためのものです。あなたが実際に二回Aコンストラクタを "コール" ここ

B() { 
    A(5); 
} 

+2

を出て、なぜ正しい方法を使用していない_「私は正しい方法がそうしていることを知っている」

  • 破壊されましたか? – user0042

  • +0

    'B'のコンストラクタは' A(int) 'コンストラクタを呼び出してローカルスコープのオブジェクトAを作成し、そのオブジェクトを破棄しました。 – MFisherKDX

    +1

    @ user0042 "これは理解のためのものです。" – LightXXV

    答えて

    4

    Bコンストラクタを見てみましょう。 B構成の一部(「デフォルト」Aコンストラクターが呼び出される場所)に一度、Bコンストラクター本体内に一時オブジェクトを作成するときに1回。

    配列はBコンストラクタの本体は非

  • Aを入力するBオブジェクト
  • の初期化の一部として呼び出さ
  • Aデフォルトコンストラクタと呼ば

    1. Bコンストラクタとしてあります一時オブジェクトの作成の一部として(引数5で)呼び出されるデフォルトのコンストラクタ
    2. 一時オブジェクトは、スコープの外に出るとBコンストラクタの本体は_
  • +0

    私はAのコンストラクタの中にこの行を追加しました:cout << "A" << endl;この出力を得ました:AはAと呼ばれるAと呼ばれ、3 2と呼ばれています。最初の2つはオブジェクトaとbであり、3つ目はコンストラクタです。 正しい場合でも、オブジェクトbの番号に影響するのはなぜですか?なぜ関数定義からデフォルト値(2)を削除したのと同じように動作しなかったのでしょうか? – LightXXV

    +0

    @ LightXXV私は少し前に急いでいたし、いくつかのことが間違っていた。更新された答え。 –

    +0

    私は自分の更新以来私の答えを削除すると思います。 – MFisherKDX

    関連する問題