正在调用基类虚拟方法,而不是子级的重写实现

问题描述 投票:0回答:1

我正在使用BOOST :: ODEINT编写ODE集成器。它要求具有逻辑的类的操作符()带有此签名“ void operator()(const std :: vector&x,std :: vector&dxdt,double t)”的重载。

我假装写了一个抽象类,它封装了通用模型逻辑和积分器逻辑,并且基本子代将实现某些特定方面(例如ODEINT所需的系统)。

我发现自己无法实现为抽象类,因为代码未编译,无法编写集成器的模板。因此,我删除了所有纯虚函数,然后对代码进行了很好的编译,但是我总是得到调用的基类方法,而不是child的实现。

#include <vector>
#include <iostream>
#include <boost/numeric/odeint.hpp>

class BaseClass {
public:
    virtual void ode(const std::vector<double> &x, std::vector<double> &dxdt, double t) {
        std::cout << "Not expected." << std::endl;
    };

    void operator() (const std::vector<double> &x, std::vector<double> &dxdt, double t) {
        std::cout << "BaseClass" << std::endl;
        this->ode(x, dxdt, t);
    };

    void integrate() {
        double t = 0, dt = 0.5;
        std::vector<double> state(2, 0.0);
        boost::numeric::odeint::runge_kutta4<std::vector<double>> stepper;
        stepper.do_step(*this, state, t, dt);
    };
};

class DerivedClass : public BaseClass {
public:
    virtual void ode(const std::vector<double> &x, std::vector<double> &dxdt, double t) {
        std::cout << "Expected." << std::endl;
    };
};

void main() {
    DerivedClass d;
    d.integrate();
}

这产生

Base Class
Not expected

我也试图使虚拟方法de

虽然我在写这篇文章,但我想将积分器的逻辑与模型分开,但是我想知道这是怎么回事。

谢谢大家!

c++ class inheritance boost odeint
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.