C의 가상 상속
C의 다중 상속을 다룰 때는 가상 상속을 이해하는 것이 중요합니다. 다음 코드 조각을 고려해보세요.
class Base { public: Base(Base* pParent); /* implements basic stuff */ }; class A : virtual public Base { public: A(A* pParent) : Base(pParent) {} /* ... */ }; class B : virtual public Base { public: B(B* pParent) : Base(pParent) {} /* ... */ }; class C : public A, public B { public: C(C* pParent) : A(pParent), B(pParent) {} // - Compilation error here /* ... */ };
이 예에서 C는 A와 B 모두에서 상속되고, 차례로 Base에서 사실상 상속됩니다. GCC는 기본 클래스에 대해 호출할 생성자를 결정할 수 없기 때문에 표시된 줄에서 컴파일 오류를 발생시킵니다.
설명:
가상 기본 클래스에는 고유한 초기화 메커니즘이 있습니다. . 가상이 아닌 기본 클래스와 달리 가상 기본 클래스는 중간 기본 클래스가 아니라 가장 많이 파생된 클래스에 의해 초기화됩니다. 이는 다이아몬드 상속 계층 구조에서 각 기본 클래스가 한 번만 정의되고 가장 많이 파생된 클래스에 의해 한 번만 초기화되어야 하기 때문입니다.
이 예에서는 C가 가장 많이 파생된 클래스입니다. 그러나 생성자에서 Base 클래스를 명시적으로 초기화하지 않습니다. 따라서 GCC는 Base의 기본 생성자를 사용하려고 시도합니다. 그러나 C는 Base에서 직접 상속되지 않기 때문에 기본 생성자에 액세스할 수 없어 컴파일 오류가 발생합니다.
해결책:
이 문제를 해결하려면 C의 생성자는 가상 기본 초기화 프로그램을 사용하여 Base 클래스를 명시적으로 초기화해야 합니다.
class C : public A, public B { public: C(C* pParent) : A(pParent), B(pParent), Base(pParent) {} /* ... */ };
C의 생성자에서는 사용할 Base 생성자를 명시적으로 지정하여 Base가 적절하게 초기화되도록 합니다.
위 내용은 가상 상속은 C의 다중 상속 생성자 초기화 문제를 어떻게 해결합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!