>백엔드 개발 >C++ >가상 상속은 C의 다이아몬드 문제를 어떻게 해결합니까?

가상 상속은 C의 다이아몬드 문제를 어떻게 해결합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-08 09:10:15736검색

How Does Virtual Inheritance Solve the Diamond Problem in 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에서 직접 상속되지 않고 가상 기본 클래스 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.