2014-04-07 2 views
0

나는이 메서드에 func(int, float, unsigned) 및 오버로드를 포함하는 기본 클래스를 가지고이 메서드는 func(int)이고 추상 메서드는 을 구현하는 파생 클래스입니다. 내 코드에서 C++ : 파생 된 인스턴스에서 순수 가상 메서드의 오버로드 호출

class Base 
{ 
public: 
    virtual void func(int x, float y, unsigned z) = 0; 

    void func(int x) 
    { 
     cout << "func with x only" << endl; 
    } 
}; 

class Derived : public Base 
{ 
public: 
    void func(int x, float y, unsigned z) 
    { 
     cout << "func override" << endl; 
    } 

}; 

, 나는 기본 func(int)의 오버로드 된 메서드를 호출하는 파생 클래스의 인스턴스를 가지고있다. 이 코드 조각을 컴파일에서

int main() 
{ 
    Derived d; 
    d.func(10);  // <<--------- 'COMPILATION ERROR' 
    return 0; 
} 

, 나는 다음과 같은 컴파일 오류가 얻을 :

error: no matching function for call to 'Derived::func(int&)' 
note: candidates are: virtual void Derived::func(int, float, unsigned int) 

무엇의이 오류/대한 이유는이 코드가 작동하지 않는 이유는 무엇입니까?

답변

2

파생 클래스 '에 기본 클래스 함수를 가져와야합니다.

당신의 아이 클래스의 선언에

using Base::func; 

어딘가를 작성하여이 작업을 수행합니다. 당신이

참고 하지 ,func 과부하를를 오버라이드 (override). C++ 11에서

+0

이 감사했다. 내가 오버라이드하지 않는 func을 '오버로드'한다는 것을 알고있다. 나는 이미이 질문에 이것을 썼다. 그러나 기본 클래스의 다른 메소드들처럼'using' 키워드가 없으면 작동하지 않는 이유를 알지 못했습니다. – Devos

+0

@ user2758900 이름 숨기기에 관한 것입니다. – billz

+0

@ Bathsheba : 어쩌면. 시맨틱에 대해 토론하기에는 너무 이른 월요일이므로 내 의견을 삭제하겠습니다. –

0

는 :

int main() 
{ 
    Base && b = Derived(); 
    b.func(10);  
    return 0; 
} 
+0

여기에서 문제는'Derived '객체에서'Base :: func'를 호출하는 것이고, 이는'b'가'Derived '유형이어야 함을 의미합니다. 'Derived '타입 일 때'Derived'에'func'가 삽입되어'Base'에 존재하는'func'라는 이름을 숨기므로 컴파일시 호출이 실패합니다. – Devos

관련 문제