>백엔드 개발 >C++ >C에서 가상 상속으로 인해 생성자 초기화 오류가 발생하는 이유는 무엇입니까?

C에서 가상 상속으로 인해 생성자 초기화 오류가 발생하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-12-13 14:16:10288검색

Why Does Virtual Inheritance Cause Constructor Initialization Errors in C  ?

가상 상속과 생성자 초기화

가상 상속은 다중 상속의 모호성을 해결하기 위해 C에서 사용하는 기술입니다. 클래스가 동일한 멤버가 있는 여러 기본 클래스에서 상속되는 경우 가상 상속을 사용하면 해당 멤버의 단일 복사본만 생성되어 메모리 오버헤드가 줄어듭니다.

그러나 가상 상속으로 인해 고유한 상황이 발생합니다. 생성자 초기화에. 제공된 예에는 Base, A, B라는 세 가지 클래스가 있으며, 여기서 A와 B는 모두 Base에서 가상으로 상속됩니다. 그런 다음 C 클래스는 A와 B를 모두 상속합니다.

문제

C 클래스 생성자에서 Base 초기화 중에 오류가 발생합니다. C는 Base에서 직접 상속하지 않기 때문에 컴파일러는 Base()에 대한 함수 호출을 일치시킬 수 없습니다. 그렇다면 이 오류는 왜 발생합니까?

가상 기본 클래스 초기화 이해

가상 기본 클래스는 비가상 기본 클래스와 초기화 프로세스가 다릅니다. 가상 기본 클래스가 상속되면 이를 초기화하는 것은 가장 많이 파생된 클래스의 책임입니다. 이 경우 클래스 C는 가장 많이 파생된 클래스이며 가상 기본 클래스 Base를 초기화해야 합니다.

Base에는 C의 직접적인 인스턴스가 없으므로 A 또는 B 생성자를 사용하여 초기화할 수 없습니다. 대신 기본 생성자를 사용하여 Base를 초기화해야 합니다. 그러나 제공된 코드에는 Base의 기본 생성자가 포함되어 있지 않습니다.

해결책

이 문제를 해결하려면 Base 클래스에 기본 생성자를 정의해야 합니다. , 다음과 같습니다:

class Base {
public:
  Base() = default; // Default constructor added
  Base(Base* pParent);
  /* implements basic stuff */
};

이 기본 생성자는 C 클래스의 기본 가상 멤버 변수를 초기화하는 데 사용됩니다.

위 내용은 C에서 가상 상속으로 인해 생성자 초기화 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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