我正在用 C++ 编写一个物理程序,以使用几种算法来近似对象的范围。我已经声明了一个包含具体和抽象方法的基类 Simulation。(例如,近似范围的函数是纯虚函数,而获得下一个位置的函数是具体的,因为无论算法如何,这都是相同的。)为了定义这些具体的方法,我已经在基类中声明了所有变量也是。在派生类中,我定义了基类的抽象方法和新的、特定于算法的方法;这要求我在基类和派生类中都定义成员。
问题是基类中定义的具体方法正在访问基类的成员,而不是派生类中定义的覆盖方法。有没有办法做到这一点,还是我的方法本身不正确?
我对构造函数也有类似的问题;从派生类的构造函数调用基构造函数正在初始化基成员。
无论如何,谢谢你的时间。虽然我对 C++ 并不完全陌生,但我更倾向于将它用作 C;我对面向对象的概念相当缺乏经验。我可能犯了一个非常基本的错误(或更可能是设计缺陷),但除了在派生类中重新定义方法之外,我还没有发现任何类似的东西或从测试中得到任何积极的结果。(我假设我应该避免这样做)
更新:尽管按照 R Sahu 的要求使成员受到保护(感谢 Ozraptor;不太确定我是如何错过的),但我将发布一些我的(现已更新的)代码:
基类:
class Simulation {
public:
Simulation();
Simulation(float, float, float, float, float, float, float, float, float);
bool IsInitialized(),
set_air_density(float),
set_delta_time(float),
set_drag_coefficient(float),
set_mass(float),
set_reference_area(float);
float next_x_position();
void set_next_x_position(float),
set_next_x_velocity(float),
set_next_y_position(float),
set_next_y_velocity(float);
protected:
static const float gravitational_acceleration_;
virtual bool SimulateRangeOrDie() = 0;
virtual void GetNextVelocity() = 0,
GetNextXVelocity() = 0,
GetNextYVelocity() = 0,
InitializeConstant() = 0;
void GetNextPosition(),
GetNextXPosition(),
GetNextYPosition(),
PushBackPositionVelocity();
bool x_position_initialized_,
x_velocity_initialized_,
y_position_initialized_,
y_velocity_initialized_;
float air_density_,
current_x_position_,
current_x_velocity_,
current_y_position_,
current_y_velocity_,
delta_time_,
drag_coefficient_,
constant_,
mass_,
next_x_position_,
next_x_velocity_,
next_y_position_,
next_y_velocity_,
reference_area_;
};
派生类之一:
class MomentumSimulation : public Simulation {
public:
MomentumSimulation();
MomentumSimulation(float, float, float, float, float, float, float, float,
float);
virtual bool SimulateRangeOrDie();
private:
virtual void GetNextVelocity(),
GetNextXVelocity(),
GetNextYVelocity(),
InitializeConstant();
void GetNextMomentum(),
GetNextXMomentum(),
GetNextYMomentum(),
Initialize(),
InitializeMomentum(),
InitializeXMomentum(),
InitializeYMomentum(),
PushBack(),
PushBackMomentum();
float current_x_momentum_,
current_y_momentum_,
next_x_momentum_,
next_y_momentum_;
};