2013-06-24 2 views
2

질문하기 전에 웹 검색을 시도했지만 어떤 용어를 사용해야하는지 잘 모르겠으며 문제에 대한 설명을 찾지 못했습니다. 이러한 대답은 allready 존재하는 경우가 여기에상속 된 멤버 함수의 매개 변수 유형에 따라 결정

을 :) 작은 샘플입니다에, 단지 날 지점 주시기 :

class IObject; 
class ClassA; 

class Base { 
public: void Method(IObject * object) {} 
}; 

class Derived : public Base { 
public: void Method(ClassA * objet) {} 
}; 

class IObject {}; 
class ClassA : public IObject {}; 

int main(int argc, char ** argv) { 
    IObject * object = new ClassA(); 
    Derived derived; 
    derived.Method(object); 
    delete object; 
    return 0; 
} 

컴파일러가 파생 :: 방법을 사용하기 때문에이 컴파일되지 않습니다 버전의 메서드를 구현할 수 있습니다. 주어진 개체에 대해 완벽하게 유효한 Base :: Method가 있습니다.

이 컴파일 (작업을)하려면, 나는 파생에 다음을 추가해야 의도 한대로

class Derived : public Base { 
public: 
    // adding this line make the Base::Method visible to the compiler ?? 
    using Base::Method; 
    void Method(ClassA * object) {} 
}; 

이 줄을 추가 한 후, 모든 작품. 내가 이해하지 못하는 이유는 무엇입니까? Base :: Method를 Base :: BaseMethod로 이름을 바꾸면 파생 된 인스턴스에서 문제없이 호출 할 수 있습니다. 컴파일러가 매개 변수의 유형에 따라 올바른 메서드를 찾지 못하는 이유는 무엇입니까 ??

+0

이제는 어떤 용어 (예 : "기능 숨기기")를 사용할지 알고 있으므로 답변과 중복 질문을 많이 발견했습니다. – Citron

답변

3

이 규칙은 C++에서 Function hiding으로 알려져 있습니다.
기본 클래스 메서드와 동일한 이름을 가진 파생 클래스의 메서드 은 파생 클래스의 기본 클래스 메서드을 숨 깁니다. 파생 클래스의 사용자는 함수 매개 변수 유형에 관계없이 파생 클래스 메서드 만 볼 수 있습니다. 기본 클래스 메서드는 Derived 클래스 범위에 존재하지 않습니다. 따라서 과부하 해결은 예상대로 작동하지 않습니다.
파생 클래스에서 Base 클래스 메서드에 액세스하려면 명시 적으로 컴파일러에서 사용 선언을 사용하여 파생 클래스 범위로 가져와야한다고 명시해야합니다.

+0

그리고 링크에 대해 감사드립니다. 내가 이해 한 바에 따르면,이 규칙은 암시 적 캐스팅에 대한 문제를 피하기 위해 도입되었습니다. 좋은 사실은 :) – Citron

2

멤버 함수 숨기기 : 기본 클래스에서 같은 이름을 가진 함수와 다른 서명을 가진 파생 클래스의 함수를 얻으면 함수의 기본 클래스 버전이 보이지 않습니다. 파생 클래스와 그 클라이언트. Here's 이것이 소개 된 이유.

+0

답변 해 주셔서 감사합니다! – Citron

관련 문제