私はこの小さなプログラムを書いて、私の理解をテストしました。理解がうまくいかないのは、コンストラクタは継承されないが、クラス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);
}
:
を出て、なぜ正しい方法を使用していない_「私は正しい方法がそうしていることを知っている」
'B'のコンストラクタは' A(int) 'コンストラクタを呼び出してローカルスコープのオブジェクトAを作成し、そのオブジェクトを破棄しました。 – MFisherKDX
@ user0042 "これは理解のためのものです。" – LightXXV