2013-05-12 3 views
4

나는 아래의 코드에 대한 컴파일러 오류에 대한 혼란 스러워요 :혼란에 대한 가상 과부하 기능

class Base { 
public: 
    virtual ~Base() { } 
    virtual void func() { } 
    virtual void func (int) { } 
    virtual void another() { } 
    virtual void another (int) { } 
}; 

class Derived : public Base { 
public: 
    void func() { } 
}; 

int main() { 
    Derived d; 
    d.func(); 
    d.func(0); 
    d.another(); 
    d.another(0); 
} 

GCC 4.6.3를 사용은, 위의 코드 (0) :: 그 Dervied 말을 d.func에서 오류가 발생합니다 func (int)가 정의되지 않았습니다.

또한 func (int)에 대한 정의를 Derived에 추가하면 작동합니다. 파생 함수에서 func() 또는 func (int)를 정의하지 않을 때도 ("다른"의 경우와 같이) 작동합니다.

여기에 가상 오버로드 된 기능에 대한 몇 가지 규칙이 분명히 있지만, 처음 만났을 때 이해가되지 않습니다. 누군가 정확히 여기에 무슨 일이 일어나는지 말해 줄 수 있니?

답변

11

func()Derived으로 대체하면 func(int)이 숨겨집니다.

gcc은 이에 대한 경고를 할 수 있습니다

$ g++ -Wall -Woverloaded-virtual test.cpp 
test.cpp:5:16: warning: 'virtual void Base::func(int)' was hidden [-Woverloaded-virtual] 
test.cpp:12:8: warning: by 'virtual void Derived::func()' [-Woverloaded-virtual] 

당신은 using으로이 문제를 해결할 수 있습니다

class Derived : public Base { 
public: 
    using Base::func; 
    void func() { } 
}; 

이유 이런 논의를 들어, Why does an overridden function in the derived class hide other overloads of the base class?

+1

를 볼 감사 이봐! ! 팁 - Woverloaded-virtual과 픽스는 정말 유용했습니다. 내가 가지고 있는지조차 몰랐던 질문에 대한 훌륭한 대답. :-) –