기본 클래스 생성자와 상속을 호출하는 개념을 구현하려고합니다. 다음 코드를 작성했지만 클래스 A의 기본 생성자를 선언하지 않으면 오류가 발생합니다. 나는 왜 오류가 발생하는지 궁금해. 당신이 B의 인스턴스를 만들려면,이 자동으로 슈퍼 클래스의 인스턴스를 생성하기 때문에기본 클래스 생성자를 호출하는 동안 기본 생성자 선언
#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++의 가상 상속 개념은 약간 부정합니다. –