我正在使用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 虽然我在写这篇文章,但我想将积分器的逻辑与模型分开,但是我想知道这是怎么回事。 谢谢大家!