c++ - 如何更改子类方法中的参数?

标签 c++ oop inheritance

假设我有以下类(class):

class LearningMethod {
public:
    virtual void optimize( lib4neuro::ErrorFunction &ef, std::ofstream* ofs = nullptr ) = 0;

    virtual std::vector<double>* get_parameters( ) = 0;
};

现在我将从它继承并创建一个新类,其中 optimize() 方法将接受 ErrorFunctionDifferentiable 类型,它继承自 ErrorFunction本身。

class GradientLearningMethod : public LearningMethod {
    virtual void optimize( lib4neuro::ErrorFunctionDifferentiable &ef, std::ofstream* ofs = nullptr ) = 0;
};

有没有正确的方法来实现这个?编译器认为,我正在创建一个新方法而不是覆盖旧方法。

最佳答案

Is there any correct way how to implement this? Compiler thinks, that I'm creating a new method and not overwriting an old one.

  1. 更改派生类中的 virtual 成员函数以使用相同的参数类型,即 lib4neuro::ErrorFunction &

  2. 在派生类中添加一个成员函数,该成员函数接受 lib4neuro::ErrorFunctionDifferentiable & 类型的参数。此函数可以使用相同的名称或不同的名称 - 这无关紧要。

  3. 对传递给第一个函数的参数执行 dynamic_cast 到覆盖的 virtual 成员函数中的 lib4neuro::ErrorFunctionDifferentiable &。如果 dynamic_cast 成功,则使用成功的 cast 对象调用第二个函数。如果没有,你将不得不想办法处理它。

关于c++ - 如何更改子类方法中的参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54718291/

相关文章:

ios - objective c 支持的继承

python - 继承和导入

c++ - 为什么我必须通过this指针访问模板基类成员?

c++ - GMP 如何在任意数量的字节上存储它的整数?

c++ - 如何检查 TCP 端口是否已被监听?

c++ - 在 visual studio 中定义与 typedef 枚举发生冲突的原因是什么?

php - Doctrine2 Lazy vs Eager,或者为什么它进行多个查询

java - super 函数在java中是如何工作的?

c++ - 堆栈中缀的前缀

c++ - 如何使用 QModelIndex 访问 QStandardItemModel 及其数据?