У меня есть некоторые проблемы с переопределением функции, и я не знаю, почему она не работает. Я продолжаю смотреть онлайн, но ничего не нашел. Наверное, мне стоит добавить, что я сейчас использую стандарт 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.
Кто-нибудь может увидеть что-то явно не так?
Я понял проблему. Проблема происходила с классом декоратора между строк:
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 = (конструктор, деструктор другая функция меры, родительская функция меры)
Когда вы запустите код, компилятор решит, какую функцию использовать
Если вы добавите virtual к своей дочерней функции, она будет выглядеть так:
Object = (конструктор, деструктор, дочерняя мера, родительская мера)
Когда вы запускаете код с этим, компилятор будет использовать дочернюю функцию