2011-12-20 42 views
1

我調用繼承方法時遇到問題。也許我錯過了一些virtualconst&但我找不到在哪裏調用繼承方法 - 編譯器錯誤

我有一個基類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 2011-12-20 08:02:31

+0

@SethCarnegie:是的。對。 – 2011-12-20 08:03:21

+0

我唯一關心的是爲每個繼承類使用1參數'classify'調用tits 2參數版本。對我來說,它可以有或沒有'虛擬'。沒有更好的,因爲我不會得到'vtable'性能損失 – 2011-12-20 08:04:18

回答

5

在子類的重載方法隱藏了基類的方法。

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

而對於OP,這裏是比你現在可能想知道的關於名稱隱藏更多的細節:http://www.gotw.ca/publications/mill08。 HTM – 2011-12-20 11:00:17

3

您可以添加一個using聲明中比約恩博動的答案,或者明確的限定在調用點:

c.Classifier::classify(some_image); 
0

你必須使用你可以用using -declaration修復範圍操作符具體指明您正在嘗試調用該函數的基類版本而不是當前類版本。