Вызов унаследованного метода - ошибка компилятора - PullRequest
1 голос
/ 20 декабря 2011

У меня проблема с вызовом унаследованного метода.Возможно, мне не хватает некоторых 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

Ответы [ 3 ]

5 голосов
/ 20 декабря 2011

Перегруженный метод в подклассе скрывает метод от базового класса. Вы можете исправить это с помощью using -декларации:

class MyClassifier : public Classifier {
public:
    using Classifier::classify;
    bool classify(const Image& ii, const rect_t& rect) const;
};
3 голосов
/ 20 декабря 2011

Вы можете добавить объявление using, как в ответе Бьёрна Поллекса, или явный квалификатор на сайте вызова:

c.Classifier::classify(some_image);
0 голосов
/ 20 декабря 2011

Вы должны использовать оператор области действия, чтобы конкретно указать, что вы пытаетесь вызвать версию функции базового класса, а не текущую версию класса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...