我有一些问题凌驾于某个功能上,我不知道为什么它无法正常工作。我一直在网上看,但我找不到任何东西。我应该补充一点,我现在正在使用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;
}
然后通过指向通用SupervisedLearner类的指针调用measureAccuracy方法:
SupervisedLearner* learner = getLearner(model, r, parser.getLearnerExtra());
...
double accuracy = learner->measureAccuracy(trainFeatures, trainLabels, &stats);
请注意,基类和子类都具有该方法的实现。该程序由于某种原因总是转到SupervisedLearner :: measureAccuracy函数。
任何人都可以看到明显错误吗?
答案 0 :(得分:0)
尝试将关键字virtual
添加到子函数中,这样编译器就知道它是一个虚函数。
通过不添加虚拟,您将实现一个全新的功能:
Object =(构造函数,析构函数,另一个度量函数,父度量函数)
运行代码时,编译器将决定使用哪个函数
如果您向子功能添加虚拟,它将如下所示: Object =(构造函数,析构函数,子度量函数,父度量函数) 使用此代码运行代码时,编译器将使用子函数
答案 1 :(得分: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);
Normalize装饰器看起来像:
class Normalize: public SupervisedLearner {
private:
SupervisedLearner* innerLearner;
public:
Normalize(SupervisedLearner* learner) : learner(innerLearner) {}
...
}
装饰器没有覆盖SupervisedLearner方法。谢谢大家的帮助。感谢@Casey为dynamic_cast(学习者)== nullptr提示。