C++ не может переопределить метод родительского класса

У меня есть некоторые проблемы с переопределением функции, и я не знаю, почему она не работает. Я продолжаю смотреть онлайн, но ничего не нашел. Наверное, стоит добавить, что я сейчас использую стандарт C++11 на всякий случай. Вот мой код:

class SupervisedLearner {
public:
    ...
    virtual double measureAccuracy(Matrix& features, Matrix& labels, Matrix* pOutStats = NULL);
}

class NeuralNet: public SupervisedLearner {
public:
    ...
    double measureAccuracy(Matrix& features, Matrix& labels, Matrix* pOutStats = NULL) override;
}

Затем метод measureAccuracy вызывается через указатель на общий класс SupervisedLearner:

SupervisedLearner* learner = getLearner(model, r, parser.getLearnerExtra());
...
double accuracy = learner->measureAccuracy(trainFeatures, trainLabels, &stats);

Обратите внимание, что и базовый класс, и дочерний класс имеют реализации метода. Программа по какой-то причине всегда переходит к функции SupervisedLearner::measureAccuracy.

Кто-нибудь может увидеть что-то явно не так?

2 ответа

Решение

Я понял проблему. Проблема происходила с классом декоратора между строк:

SupervisedLearner* learner = getLearner(model, r, parser.getLearnerExtra());
...
double accuracy = learner->measureAccuracy(trainFeatures, trainLabels, &stats);

Итак, код выглядел так:

SupervisedLearner* learner = getLearner(model, r, parser.getLearnerExtra());
...
learner = new Normalize( learner );
...
double accuracy = learner->measureAccuracy(trainFeatures, trainLabels, &stats);

Декоратор Normalize выглядит так:

class Normalize: public SupervisedLearner {
private:
    SupervisedLearner* innerLearner;
public:
    Normalize(SupervisedLearner* learner) : learner(innerLearner) {}
    ...
}

Декоратор не переопределил метод SupervisedLearner. Спасибо всем за помощь. Спасибо @Casey за подсказку dynamic_cast(ученик) == nullptr.

Попробуйте добавить ключевое слово virtual для вашей дочерней функции, таким образом, компилятор знает, что это виртуальная функция. Не добавляя виртуальную, вы реализуете совершенно новую функцию: Object = (конструктор, деструктор другой функции меры, функция родительской меры) Когда вы запустите код, компилятор решит, какую функцию использовать

Если вы добавите виртуальную функцию в свою дочернюю функцию, она будет выглядеть следующим образом: Object = (конструктор, деструктор, функция дочерних мер, функция родительских мер) Когда вы запустите код с этим, компилятор будет использовать дочернюю функцию.

Другие вопросы по тегам