ベースクラスコンストラクタと継承を呼び出すという概念を実装しようとしています。次のコードを記述しましたが、クラスAのデフォルトコンストラクタを宣言しないと、なぜ私はエラーが発生しているのだろうか。ベースクラスコンストラクタを呼び出すときにデフォルトコンストラクタを宣言する
#include <iostream>
using namespace std;
class A
{
int a;
public:
A() {} //Default Constructor
A(int x)
{
a=x;cout<<a;
cout<<"A Constructor\n";
}
};
class B: virtual public A
{
int b;
public:
B(int x)
{
b=x;cout<<b;
cout<<"B Constructor\n";
}
};
class C: virtual public A
{
int c;
public:
C(int x)
{
c=x;cout<<c;
cout<<"C Constructor\n";
}
};
class D: public B,public C
{
int d;
public:
D(int p,int q,int r,int s):A(p),B(q),C(r)
{
d=s;cout<<d;
cout<<"D Constructor\n";
}
};
int main()
{
D d(1,2,3,4);
return 0;
}
具体的にはどのエラーですか? – user0042
'A'デフォルトコンストラクタは' B'と 'C'クラスに暗黙的に使用されます。何年も前にこの質問が出てきたことを覚えているので、私は正式ではわかりません。答えがあったのは、このような場合、 'B'と' C'の暗黙的な初期化は存在しないとみなされるべきです。とにかく、これらの初期化は事実上無視されます。これは、仮想基底クラスが、最も派生したクラス( 'D')の中で初期化されるためです。はい、C++での仮想継承の概念は少し汚れています。 –