C ++不能覆盖父类方法

时间:2013-11-08 19:58:11

标签: c++ c++11 polymorphism method-overriding

我有一些问题凌驾于某个功能上,我不知道为什么它无法正常工作。我一直在网上看,但我找不到任何东西。我应该补充一点,我现在正在使用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函数。

任何人都可以看到明显错误吗?

2 个答案:

答案 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提示。