> 백엔드 개발 > C++ > C에서 부모 클래스의 메서드를 호출할 때 `b->DoSomething()` 대신 `b->A::DoSomething()`을 사용해야 하는 이유는 무엇입니까?

C에서 부모 클래스의 메서드를 호출할 때 `b->DoSomething()` 대신 `b->A::DoSomething()`을 사용해야 하는 이유는 무엇입니까?

DDD
풀어 주다: 2024-11-03 08:30:29
원래의
729명이 탐색했습니다.

Why do I need to use `b->C에서 상위 클래스의 메서드를 호출할 때 `b->DoSomething()` 대신 A::DoSomething()`을 사용합니까? 
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿