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 /* ... */ };
이 코드를 컴파일할 때 GCC는 표시된 줄에서 오류를 보고합니다. 이 오류는 클래스 C가 Base에 대한 초기화를 제공하지 않기 때문에 발생합니다. 가상 기본 클래스는 표시되는 가장 많이 파생된 클래스에 의해서만 초기화됩니다. 이 경우에는 클래스 C가 됩니다.
가상 기본 클래스는 직접 상속되지 않으므로 초기화 중에 Base의 기본 생성자가 호출되지 않습니다. 초기화 목록을 통해 초기화하거나 동일하거나 파생된 유형의 다른 개체에 할당하여 초기화해야 합니다. 이 경우 클래스 C는 Base에 대한 초기화를 지정하지 않아 컴파일 오류가 발생합니다.
이를 해결하려면 클래스 C의 생성자에 Base에 대한 명시적인 초기화를 포함하도록 코드를 수정해야 합니다. C 생성자를 다음으로 대체하면 달성할 수 있습니다.
class C : public A, public B { public: C(C* pParent) : Base(pParent), A(pParent), B(pParent) {} // - Correct initialization here /* ... */ };
클래스 C의 생성자 내에서 Base를 명시적으로 초기화함으로써 컴파일러는 이제 가상 상속을 적절하게 처리하고 성공적으로 컴파일할 수 있습니다. 코드입니다.
위 내용은 C의 가상 상속은 다이아몬드 문제의 기본 클래스 초기화를 어떻게 처리합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!