겹치는 유형을 사용한 다중 상속의 명확성
여러 기본 클래스에 겹치지 않는 세트가 있는 경우 다중 상속으로 인해 모호한 클래스 멤버 호출이 발생할 수 있습니다. 다형성 방법에 적용 가능한 유형입니다. 가변 기본 클래스 템플릿인 Base가 해당 유형 매개변수 팩에 포함된 템플릿 매개변수로만 호출할 수 있는 foo() 메서드를 정의하는 시나리오를 생각해 보세요.
이 예에서는 다음과 같습니다.
<code class="cpp">template <typename ... Types> class Base { public: template <typename T> typename std::enable_if<Contains<T, Types ...>::value>::type foo() { std::cout << "Base::foo()\n"; } };
겹치지 않는 유형 집합을 사용하여 Base에서 두 번 상속하는 Derived 클래스를 파생시킬 수 있습니다.
<code class="cpp">struct Derived: public Base<int, char>, public Base<double, void> {};</code>
Derived().foo
컴파일러가 모호성을 해결할 수 없는 이유
클래스에 대한 병합 규칙 -member 조회 상태는 파생 클래스(이 경우 Derived)의 선언 세트가 비어 있으면 멤버(이 경우 foo)에 대한 조회 세트가 모든 직접 기본 클래스에서 병합됩니다. 그러나 기본 클래스에는 foo에 대한 서로 다른 선언 세트가 있으므로 병합이 모호합니다.
해결 방법
모호성을 해결하기 위해 Derived 선언 세트를 만들 수 있습니다. 기본에서 foo 메서드에 대한 using 선언을 추가하여 비어 있지 않음:
<code class="cpp">struct Derived: public Base<int, char>, public Base<double, void> { using Base<int, char>::foo; using Base<double, void>::foo; };</code>
Using 선언은 기본 클래스의 멤버를 파생 클래스로 가져와 Derived에 foo의 두 오버로드를 효과적으로 제공합니다. 그런 다음 컴파일러는 적절한 오버로드를 명확하게 호출할 수 있습니다.
대체 솔루션
위 내용은 다형성 메소드를 호출할 때 유형이 겹치는 다중 상속의 모호성을 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!