>  기사  >  백엔드 개발  >  다형성 메소드를 호출할 때 유형이 겹치는 다중 상속의 모호성을 해결하는 방법은 무엇입니까?

다형성 메소드를 호출할 때 유형이 겹치는 다중 상속의 모호성을 해결하는 방법은 무엇입니까?

Linda Hamilton
Linda Hamilton원래의
2024-10-25 06:23:02254검색

How to Resolve Ambiguity in Multiple Inheritance with Overlapping Types When Calling Polymorphic Methods?

겹치는 유형을 사용한 다중 상속의 명확성

여러 기본 클래스에 겹치지 않는 세트가 있는 경우 다중 상속으로 인해 모호한 클래스 멤버 호출이 발생할 수 있습니다. 다형성 방법에 적용 가능한 유형입니다. 가변 기본 클래스 템플릿인 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()를 호출하면 컴파일러가 해결할 수 없습니다. 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의 두 오버로드를 효과적으로 제공합니다. 그런 다음 컴파일러는 적절한 오버로드를 명확하게 호출할 수 있습니다.

대체 솔루션

  • 기본 수집기 클래스: 이 클래스 템플릿은 선언을 사용하여 수집할 수 있습니다. 여러 베이스의 경우 명시적 선언의 필요성이 줄어듭니다.
  • C 17의 팩 확장: 팩 확장을 사용하면 BaseCollector 템플릿을 한 줄로 단순화하여 더욱 간결하고 효율적으로 만들 수 있습니다. 컴파일합니다.

위 내용은 다형성 메소드를 호출할 때 유형이 겹치는 다중 상속의 모호성을 해결하는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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