DoSomething()` 대신 />A::DoSomething()`을 사용합니까? " />
범위 충돌에 대한 C 오버로드 해결
제공된 코드 조각은 동일한 이름을 가진 두 메서드가 서로 다른 범위에 존재할 때 C 오버로드 해결의 일반적인 문제를 보여줍니다. . 이 시나리오에서 컴파일러는 범위 가시성 규칙을 사용하여 적용 가능한 메서드를 결정합니다.
문제:
클래스 B의 인스턴스에서 DoSomething 메서드를 호출하는 경우 , 단순히 b->DoSomething() 대신 b->A::DoSomething()을 명시적으로 사용해야 하는 이유는 무엇입니까?
답변:
The 컴파일러는 기본적으로 가능한 가장 작은 이름 범위를 고려하며, 이 경우 클래스 B에 정의된 DoSomething 메서드만 인식합니다. 인수 목록이 이 메서드의 서명과 일치하지 않으므로 컴파일러에서 오류가 발생합니다.
이 범위 지정 문제를 해결하려면 두 가지 접근 방식이 있습니다.
명시적 범위 확인:
b->A 구문을 사용하여 원하는 메서드의 범위를 명시적으로 지정합니다.: 컴파일러가 클래스 A에 정의된 메서드를 인식하도록 하는 DoSomething().
범위 상속:
using 지시문을 사용하여 원하는 메서드를 범위로 가져옵니다. 파생 클래스의. 예를 들면 다음과 같습니다.
<code class="cpp">class B : public A { public: using A::DoSomething; // ... }</code>
이러한 메서드 중 하나를 사용하면 컴파일러가 오버로드를 올바르게 해결하고 의도한 DoSomething 메서드를 호출하는지 확인할 수 있습니다.
위 내용은 C에서 부모 클래스의 메서드를 호출할 때 `b->DoSomething()` 대신 `b->A::DoSomething()`을 사용해야 하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!