[英]How to overwrite a pure virtual function with dynamic binding
我正在嘗試解決 Pitt-Francis 文本https://link.springer.com/book/10.1007/978-3-319-73132-2中關於抽象 ODE class 的練習 7.3。
抽象 class 給出為
class AbstractODESolver
{
private:
...
public:
....
virtual double RightHandSide(double y, double t) = 0;
virtual double SolveEquation() = 0;
};
派生的 class 給出為
class ForwardEuler: public AbstractODESolver
{
public:
double RightHandSide(double y, double t);
double SolveEquation();
};
如何在 ForwardEuler 中轉換 RightHandSide 以便在運行時定義它?
特別是主文件可以采用以下形式
double RHS(double y, double t);
int main(int argc, char* argv[])
{
AbstractODESolver* p_ODEs = new ForwardEuler;
return 0;
}
double RHS(double y, double t)
{
return 1+t;
}
我想寫一些類似的東西
p_ODEs->RightHandSide = &RHS;`
指向 function RHS
。
給ForwardEuler
class 一個數據成員來存儲 function,並在構造函數中傳遞它。 RightHandSide
function 只會調用傳入的 function。
class ForwardEuler: public AbstractODESolver
{
public:
ForwardEuler(std::function<double(double, double)> rhs): rhs(rhs) {}
double RightHandSide(double y, double t) { return rhs(y, t); }
double SolveEquation();
private:
std::function<double(double, double)> rhs;
};
...
double RHS(double y, double t);
AbstractODESolver* p_ODEs = new ForwardEuler(RHS);
這是我不需要std::function
的解決方案,我認為這是本章教授的技術所需的解決方案。
(根據@Paul Sanders)
class ForwardEuler: public AbstractODESolver
{
public:
ForwardEuler(double (*pRhs)(double, double));
double RightHandSide(double y, double t);
double SolveEquation();
private:
double (*mRhs)(double y, double t);
};
ForwardEuler::ForwardEuler(double (*pRhs)(double, double))
{
mRhs = pRhs;
}
double ForwardEuler::RightHandSide(double y,double t)
{
return (*mRhs)(y,t);
}
主function
double RHS(double y, double t);
int main(int argc, char* argv[])
{
AbstractODESolver* p_ODEs = new ForwardEuler(RHS);
std::cout<<(*p_ODEs).RightHandSide(1.0,1.0)<<std::endl;
return 0;
}
double RHS(double y, double t)
{
return 1+t;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.