문제

나는 Stroustrup에 의해 C ++ 0x FAQ를 읽고 있었고이 코드를 고수했습니다. 다음 코드를 고려하십시오

struct A
{
    void f(double)
    {
        std::cout << "in double" << std::endl;
    }
};

struct B : A
{
    void f(int)
    {
        std::cout << "in int" << std::endl;
    }
};


int main()
{
    A a; a.f(10.10);  // as expected, A.f will get called
    B b; b.f(10.10);  // This calls b.f and we lose the .10 here
    return 0;
}

내 이해는 유형이 상속 될 때, 모든 보호 및 공개 회원은 파생 클래스에서 액세스 할 수 있습니다. 그러나이 예에 따르면, 그것은 내가 틀린 것 같습니다. 나는 기대하고 있었다 BF 기본 클래스를 호출합니다 에프. 파생 클래스를 변경하여 예상 결과를 얻었습니다.

struct B : A
{
    using A::f;
    void f(int)
    {
        std::cout << "in int" << std::endl;
    }
};

질문

  1. 첫 번째 코드에서 작동하지 않는 이유는 무엇입니까?
  2. C ++ 표준의 어떤 섹션 에서이 모든 범위 규칙을 설명합니까?
도움이 되었습니까?

해결책

첫 번째 코드는 C ++로 작동하도록 작동합니다.

과부하 해상도는 매우 복잡한 규칙 세트를 따릅니다. Stroustrup의 C ++ 성경에서 15.2.2 [A] 다른 기본 클래스의 기능 사이의 mbiguities는 인수 유형에 따라 해결되지 않습니다."

그는 당신이 설명한대로 "사용"의 사용을 계속 설명합니다.

이것은 언어의 디자인 결정이었습니다.

나는 표준보다는 Stroustrup 책을 따르는 경향이 있지만, 그것이 거기에 있다고 확신합니다.

편집하다

여기에 (표준에서) :

13 장

동일한 범위의 단일 이름에 대해 둘 이상의 다른 선언이 지정되면 해당 이름이 과부하된다고합니다.

그리고:

13.2 선언 일치

1 동일한 이름의 두 함수 선언은 동일한 범위에 있고 동일한 매개 변수 선언이있는 경우 동일한 함수를 나타냅니다 (13.1). 파생 클래스의 함수 멤버는 기본 클래스에서 동일한 이름의 함수 구성원과 같은 범위가 아닙니다.

다른 팁

A :: F는 "과부하"또는 "재정의"대신 "숨겨진"이기 때문입니다. 나타내다:

http://www.parashift.com/c++-faq-lite/strange-inheritance.html#faq-23.9

검색 과부하 해상도. ㅏ 비슷하지만 동일한 질문이 아닙니다.

C ++에서는 스코프를 가로 질러 과부하가 발생하지 않으며 파생 클래스에서 범위가 지정된 것은 예외가 아닙니다.(C ++ 프로그래밍 언어에 따라)

자세한 내용은 확인하십시오 http://www.research.att.com/~bs/bs_faq2.html#overloadderived

첫 번째 경우, 기본 클래스 방법 'f'는 숨겨진 파생 클래스 방법으로. C ++에는 스코프를 가로 질러 과부하가 없습니다. 그것이 호출되지 않은 이유입니다. C ++ 표준은 모든 멤버 이름 조회 규칙을 섹션 10.2 회원 이름 조회 [class.member.lookup. HTH

코드의 첫 번째 버전은 실제로 b :: f를 호출해야합니다. 구조 "b"에서 "f"기호를 다시 정의하므로 구조 "a"에서 원래 기호 "f"를 숨 깁니다. 그것은 과부하가 아닙니다.

컴파일러가 bf ()를 충족 할 때마다 "b"구조물을 기호 "f"에 대해 검색합니다. 거기에 존재하므로 컴파일러는 B :: F (int)를 호출하여 int로 2 배를 변환하기로 결정합니다. 더 적합한 기능을 위해 부모 클래스를 스캔 할 필요가 없습니다 ...

그러나 "A :: F 사용"을 추가 할 때 컴파일러가 "F"의 상위 클래스를 스캔 할 수있는 명시 적 지침입니다. 이제 B 클래스에는 int와 double의 두 가지 과부하 기능이 있습니다.

또한 원래 예제에서 "사용"지시문을 사용하지 않고 BA :: F ()를 쓸 수 있다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top