使用基类中的不同子类函数

时间:2017-04-17 10:23:44

标签: c++ inheritance

现在说我有一个基类,我们称之为GameEngineGameEngine类继承了另一个类的几个函数。现在我有几个游戏状态,我需要将子类多态应用于这个问题:几个游戏状态都需要绘制游戏窗口的背景。关键是,我必须只有一个类来初始化我的游戏窗口。我的问题是,当我需要将游戏状态从一个更改为另一个时,我该怎么办?从本质上讲,我如何从我的超类中使用不同版本的子类函数(比如DrawBackground)?

代码:

BaseEngine *gameEngine;

gameEngine = new MenuState(this);

iResult = gameEngine->Initialise(...); // To initialise the window

// I need to find a way to transfer my state from Menu to Play after the window is initialised

iResult = gameEngine->MainLoop(); // To refresh the window (in case of background changed)

gameEngine->Deinitialise();

所以在上面的代码中,我有一个BaseEngine可以做几个函数(在窗口中绘制一些东西)。我现在有两种游戏状态,MenuStatePlayState。我的BaseEngine中有一个名为DrawBackground()的虚拟函数,我需要在菜单和播放状态下重新定义它(不同的行为)。现在关键点只有一个状态(Base,Menu或Play)可以初始化窗口。但是我需要它使用不同版本的派生类(菜单和播放)在状态改变时绘制不同的背景。

1 个答案:

答案 0 :(得分:0)

你要问的是什么并不是很清楚,但感觉你想要的是策略模式(也就是说,简单来说,改变一些内部对象/算法来完成这项工作)。

在处理继承时,您应该遵循所谓的is-a关系(Wikipedia on Inheritance)。在您的问题中,GameEngine (具体为MenuState)。

您实际应该做的是将状态实施为GameEngine的策略(请参阅Strategy Pattern on Wikipedia,有些人,包括我,称之为政策模式,这是更多自我解释我认为)。你可以有几个继承的类,比如说BaseState,你应该通过GameEngine之类的东西在GameEngine::setState(std::unique_ptr<BaseState> state)上设置这些状态。 GameEngine根据其设定的策略采取不同的行动。所以在一个简单的例子中,我们可以说GameEngine::MainLoop()将调用虚拟BaseState::draw()函数。因此,绘制的数据仅由GameEngine上使用GameEngine::setState()的策略集控制。

简单地说,将行为移至BaseState策略并更改策略以更改行为。

您可以选择使用某种事件机制来更改策略(state)。有Boost.Signal,Qt有自己的,还有其他的,但是为了简单的需要实现一个是简单的,更容易感谢C ++ 11。

相关问题