2011-12-20 4 views
1

상속 된 메서드를 호출하는 데 문제가 있습니다. 아마 좀 virtual, const 또는 &를 그리워하지만상속 된 메서드 호출 - 컴파일러 오류

내가 한 "진짜"를 하나의 가상 기능을 가진 기본 클래스 Classifier이 어디 찾을 수없는, "진짜"기능은 가상 하나를 호출합니다. 자식 클래스 MyClassifier은 가상 계승 된 메톤을 정의합니다. 이제 MyClassifier 객체에서 "실제"클래스를 호출하면 컴파일러 오류가 발생합니다.

class Classifier { 
    public: 
    bool classify(const Image& ii) 
    { 
     return classify(ii, ii.getRect()); 
    } 

    virtual bool classify(const Image& ii, const rect_t& rect) const = 0; 
}; 

class MyClassifier : public Classifier { 
    public: 
    bool classify(const Image& ii, const rect_t& rect) const; 
}; 

bool 
MyClassifier::classify(const Image& ii, const rect_t& rect) const 
{ 
    // do stuff... 
} 

호출 코드는 다음과 같습니다

// main... 
MyClassifier c; 
Image some_image; 

c.classify(some_image); 

그리고 오류 :

error: no matching function for call to ‘MyClassifier::classify(const Image&) const’ 
note: candidate is: 
note: virtual bool MyClassifier::classify(const Image&, const rect_t&) const 
note: candidate expects 2 arguments, 1 provided 
+0

@ Jakub 실제로 C++의 가상 메커니즘을 사용하려면 포인터를 사용해야합니다. – MDman

+0

@SethCarnegie : 예. 권리. –

+0

유일하게 신경 쓰이는 것은 각 상속 된 클래스에 대해 2- 매개 변수 버전을 호출하는 1- 매개 변수'classify'를 갖는 것입니다. 나를 위해 그것이'가상'의 유무에 관계없이있을 수 있습니다. 'vtable'성능 패널티를 얻지 못해서 더 좋지 않다. –

답변

5

서브 클래스의 오버로드 된 메서드는 기본 클래스에서 메서드를 숨 깁니다. 당신은 사용할 필요가

c.Classifier::classify(some_image); 
+0

그리고 OP에 대해서는 여기에 숨어있는 이름에 대해 알고 싶은 것보다 자세한 내용이 나와있다. http://www.gotw.ca/publications/mill08. htm –

3

당신은, 비욘 Pollex의 대답으로 using 선언을 추가 할 수 있습니다 또는 명시 적 규정 : 당신은 using -declaration으로 문제를 해결할 수 있습니다 범위 연산자는 특히 현재 클래스 버전이 아닌 함수의 기본 클래스 버전을 호출하려고한다는 것을 나타냅니다.

0

: 전화 사이트에서

class MyClassifier : public Classifier { 
public: 
    using Classifier::classify; 
    bool classify(const Image& ii, const rect_t& rect) const; 
}; 
관련 문제