C++ C++;can';t重写父类方法

C++ C++;can';t重写父类方法,c++,c++11,polymorphism,overriding,C++,C++11,Polymorphism,Overriding,我在重写函数时遇到了一些问题,我不知道为什么它不起作用。我一直在网上找,但什么也没找到。我应该补充一点,我现在正在使用c++11标准,以防万一。这是我的密码: class SupervisedLearner { public: ... virtual double measureAccuracy(Matrix& features, Matrix& labels, Matrix* pOutStats = NULL); } class NeuralNet: publ

我在重写函数时遇到了一些问题,我不知道为什么它不起作用。我一直在网上找,但什么也没找到。我应该补充一点,我现在正在使用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);
请注意,基类和子类都有该方法的实现。出于某种原因,该程序总是转到受监控的Learner::measureAccuracy函数


有人看到明显的错误吗?

尝试将关键字
virtual
添加到子函数中,这样编译器就知道它是一个虚拟函数。 通过不添加虚拟机,您实现了一个全新的功能: Object=(构造函数、析构函数或其他度量函数、父度量函数) 运行代码时,编译器将决定使用哪个函数

如果将虚拟添加到子函数中,它将如下所示: Object=(构造函数、析构函数、子度量函数、父度量函数)
当您使用这个函数运行代码时,编译器将使用子函数

我解决了这个问题。问题发生在两行之间的decorator类上:

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提供的dynamic_cast(learner)=nullptr提示。

只是一个建议:如果在派生类中重写虚拟函数,请使用
override
。getLearner()实例化了什么?我还应该补充一点,我曾尝试显式地将“learner”强制转换到NeuralNet*,但没有成功。可能性(1)
getLearner
实际上并没有返回指向
NeuralNet
的指针。测试
dynamic_cast(学习者)=nullptr
。可能(2)其中一个方法名的输入错误导致派生类的方法实际上不是重写。@ScottCrunketon请确保矩阵类型相同。将这两个类放在同一个文件中以确保。还要确保您没有意外派生的另一个SupervisedLearner类…如果您在父类中声明了一个虚函数,那么它在所有子类中实际上都是虚函数。在子类中添加virtual关键字是一种很好的做法,但在这种情况下不会影响结果。