2010-07-08 3 views
12

파생 클래스에서 기본 클래스의 함수 이름을 다시 정의하거나 오버로드하면
파생 클래스에서 오버로드 된 함수를 액세스하거나 볼 수 없습니다.
이유가 무엇입니까 ?? 우리는 그 함수의 모든 오버로드 된 버전이 파생 클래스
객체에 사용할 수있는 다음 파생 클래스 의 기본 클래스에서 oveloaded 기능에 과부하가 걸리지 않으면이 왜오버로드 된 함수는 파생 클래스에 숨겨져 있습니다

입니까 ??
이유가 무엇입니까. 컴파일러와 링커 레벨
에서 설명하면 더 도움이 될 것입니다. 이런 종류의 시나리오를 지원하는 것이 불가능합니까 ?? 이것은 실제 기술적 인 이유가 없습니다

Edited 
For examble: 

class B 
{ 

    public: 
    int f() {} 
    int f(string s) {} 
}; 

class D : public B 
{ 
    public: 
    int f(int) {} 
}; 

int main() 
{ 
    D d; 
    d.f(1); 
    //d.f(string); //hidden for D 
} 

Now object 'd' can't access f() and f(string).
+2

일부 예제 코드를 게시해도 설명이 명확하지 않습니다. –

+1

[가능한 이유는 파생 클래스의 재정의 된 함수가 기본 클래스의 다른 오버로드를 숨 깁니다.] (http://stackoverflow.com/questions/1628768/why-does-an-overridden-function-in-the- derived-class-hide-other-overloads of the) – sbi

+0

@sbi 중복 질문을 게시해서 죄송합니다. 사실 나는 비슷한 질문이 있으면 얼마 동안 노력했지만 아무 것도 찾지 못했습니다. 내 검색 패턴이 잘못되었으므로 기존 질문을 찾지 못했습니다. – esh

답변

12

TTBOMK, 그것은 언어를 만들 때 스트로브 스트 룹, 더 나은 기본값으로이 간주 단지입니다. (.이 년이 우변이 암시 적으로 비 const 참조에 결합하지 않는 규칙과 비슷)

은 쉽게 명시 적으로 파생 클래스에 기본 클래스 버전을 가져 수 그것을 해결할 수 있습니다 '범위 :

class base { 
public: 
    void f(int); 
    void g(int); 
}; 

class derived : public base { 
public: 
    using base::f; 
    void f(float); 
    void g(float); // hides base::g 
}; 

또는하여 명시 적으로 호출 :

derived d; 
d.base::g(42); // explicitly call base class version 
+3

이 답변은 다른 관련 질문에 대한 근거를 제공합니다 - http://stackoverflow.com/questions/1628768/why-does-an-overridden-function-in-the-derived-class-hide-other-overloads-of-/1629074 # 1629074 –

+1

이 그룹의 회원이되어 매우 기쁩니다. 여기 회원들은 대단합니다. 나는 대답을보기가 너무 즐겁다. – esh

+0

@jon : 사실,이 질문은 중복됩니다. 나는 이것을 삭제하기로 표결했다. – sbi

6

기능을 사용할 수 있습니다, 당신은 명시 적으로 호출해야합니다 :

struct A { 
    void f(){} 
}; 

struct B : public A { 
    void f() {} 
}; 

int main() { 
    B b; 
    b.f();  // call derived function 
    b.A::f(); // call base function 
}