0

我在覆盖函数时遇到了一些问题,我不知道为什么它不起作用。我一直在网上寻找,但我没有找到任何东西。我可能应该补充一点,我现在正在使用 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 函数。

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

4

2 回答 2

0

尝试将关键字添加virtual到您的子函数中,这样编译器就知道它是一个虚函数。通过不添加虚拟,您正在实现一个全新的函数: Object = (constructor, destructor another measure function, parent measure function) 当您运行代码时,编译器将决定使用哪个函数

如果将 virtual 添加到子函数,它将如下所示: Object = (constructor, destructor, child measure function, parent measure function) 当您使用此运行代码时,编译器将使用子函数

于 2013-11-08T21:25:13.587 回答
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(learner) == nullptr 提示。

于 2013-11-08T21:26:09.477 回答