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에서 직접 상속되지 않고 가상 기본 클래스 A 및 B를 통해 상속됩니다. 이는 C 생성자에서 Base의 초기화가 가장 많이 파생된 클래스 생성자(이 경우 C)에 위임됨을 의미합니다. .
그러나 C는 초기화 목록에서 Base 하위 객체를 명시적으로 초기화하지 않습니다. 따라서 이 하위 개체를 초기화하려면 Base의 기본 생성자를 호출해야 합니다. 그러나 Base의 기본 생성자는 C의 직접적인 기본 클래스가 아니기 때문에 C의 생성자 범위에서 액세스할 수 없습니다.
이 문제를 해결하려면 C는 해당 클래스에서 Base의 기본 생성자를 명시적으로 호출해야 합니다. 초기화 목록. 이렇게 하면 가상 기본 하위 개체가 올바르게 초기화됩니다. 수정된 코드는 다음과 같습니다.
class C : public A, public B { public: C(C* pParent) : A(pParent), B(pParent), Base() {} // - Explicit call to Base() /* ... */ };
위 내용은 가상 상속은 C의 다이아몬드 문제를 어떻게 해결합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!