我有这个抽象基类ODESolver:
//ODESolver.h
#ifndef ODESolver_H
#define ODESolver_H
#include "doublependulum.h"
class ODESolver
{
public:
ODESolver( DoublePendulum&); //constr
virtual ~ODESolver(); //destr
virtual void predict (const double &)=0; //virtual
protected:
DoublePendulum DoublePend;
};
#endif
实施:
//ODESolver.cpp
#include "ODESolver.h"
//constructor
ODESolver::ODESolver( DoublePendulum & param)
:DoublePend(param)
{}
//destructor
ODESolver::~ODESolver(){}
我也有这个类ODEEuler,它继承自ODESolver
//ODEEuler.h
#ifndef ODEEuler_H
#define ODEEuler_H
#include "ODESolver.h"
class ODEEuler : public ODESolver
{
public:
ODEEuler(DoublePendulum &);
virtual ~ODEEuler();
virtual void Predict(const double &);
};
#endif
实施
//ODEEuler.cpp
#include "ODEEuler.h"
#include <iostream>
using namespace::std;
ODEEuler::ODEEuler (DoublePendulum ¶m)
:ODESolver(param)
{}
//destructor
ODEEuler::~ODEEuler(){}
void ODEEuler::Predict(const double &dt=0.01)
{
DoublePend=DoublePend+DoublePend.Derivative()*dt;
cout << DoublePend.getUp().getTheta() << endl; \\ I want to print getTheta on the screen form my getUp Pendulum from my Doublepend
}
我现在想测试我的ODEEuler,所以我在我的主文件中创建了一个对象:
//Main.cpp
#include "pendulum.h"
#include "doublependulum.h"
#include "ODEEuler.h"
#include "ODESolver.h"
#include <iostream>
using namespace::std;
int main()
{
Pendulum MyPendulum(1.5,1.5,1.5,1.5);
DoublePendulum MyDoublePendulum(MyPendulum,MyPendulum,9.81);
ODEEuler myODEEuler(MyDoublePendulum);
return 0;
}
我一直收到这个错误:
1&gt; .... \ main.cpp(24):错误C2259:'ODEEuler':无法实例化 抽象类1&gt;由于以下成员:1&gt; “无效 ODESolver :: predict(const double&amp;)':是抽象1&gt;
..... \ odesolver.h(11):参见'ODESolver :: predict'的声明
我检查了我在虚拟虚拟预测功能中使用的所有类型是否与其他地方相同。我想这可能是我做错了概念。究竟是什么意思我不能实例化,因为'预测'是抽象的?
提前感谢您的支持!
答案 0 :(得分:4)
您的派生类需要实现纯虚函数才能实例化。
virtual void predict (const double &)=0;
^
void ODEEuler::Predict(const double &dt=0.01)
^
注意大写p
它使派生类中的方法成为一种不同的方法,并且最终永远不会定义基类纯虚方法。