2011-12-20 20 views
1

継承されたメソッドの呼び出しに問題があります。おそらく私は、いくつかのvirtualを欠場const&が、私は一つの「本物」と1つの仮想関数で、基本クラスClassifierを持っているところ継承されたメソッドの呼び出し - コンパイラエラー

私は見つけることができない、「本物」の機能は、仮想1を呼び出します。子クラス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

私が気にしているのは、継承されたクラスごとに1パラメータの 'classify'呼び出しの2パラメータバージョンを持つことだけです。私にとって、それは「仮想」の有無にかかわらず可能です。私は '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; 
}; 
関連する問題