2013-11-08 3 views
0

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

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.

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

+1

Просто предложение: используйте 'override', если вы переопределяете виртуальные функции в производных классах. – rightfold

+1

Что делает getLearner() экземпляр? – helb

+0

Я также должен добавить, что я попытался явно наложить «ученик» на NeuralNet *, но это не сработало. –

ответ

0

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

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); 

декоратор Нормализовать выглядит следующим образом:

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

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

0

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

If добавить виртуальные к вашей функции ребенка он будет выглядеть следующим образом: Object = (конструктор, деструктор, функция ребенок меры, родительская мера функция) При запуске кода с этим компилятор будет использовать функцию дЕТСКОГО

+0

Если у вас есть функция, объявленная виртуальной в родительском классе, она будет фактически виртуальной во всех дочерних классах. Хорошая практика заключается в добавлении ключевого слова virtual в дочерние элементы, но не повлияет на результат в этом случае. – Charlie