C ++ - 将派生类分配给基类

时间:2014-08-31 16:59:48

标签: c++ class inheritance overloading

的StackOverflow!

我来自Java饱和的背景,我第一次尝试使用C ++。我正在编写一个基类来表示游戏状态(暂停状态,播放状态,菜单状态)。 Engine类将保持对状态对象的引用,AKA是当前游戏状态,然后在游戏循环期间调用该状态的update,render和pollInput函数。

在Java中,我会这样做:

在我的Engine类中,我需要当前的状态变量:

State currState = new MainMenuState();

然后,如果我想将当前状态设置为Play状态,我可以这样做:

currState = new PlayState();

现在,我必须做的就是确保我的引擎调用正确状态的update方法是调用当前状态的更新方法,我可以这样做,因为PlayState,MainMenuState和我所有其他状态都扩展了State类,有更新方法。

public void update()
{
currState.update();
}

如何在C ++中执行此类操作?我决定将所有派生类定义为State类中的公共内部类(我喜欢整合代码)。 让内部课程延伸他们的外部课程对我来说是不好的做法吗?

我仍然需要在我的引擎中维护对当前状态的引用,但是我刚刚了解了将派生类分配给基类的切片问题,如下所示:

State currState = new State::MainMenuState();

因此,如果我理解正确,我就不能像在Java中那样将派生类分配给C ++中的基类对象。 那么如何保留一个可能包含代表所有不同派生类的值的对象呢?

如果您需要我提供更多信息,请与我们联系。提前谢谢!

2 个答案:

答案 0 :(得分:3)

如果你要复制对象,你只会遇到切片问题。为了实现你想要的,你应该使用指针和虚方法。如果你将derrived类的对象指针分配给基类指针,你就可以了。所以State* currState = new State::MainMenuState();应该可以正常工作。

或者有人评论说,更现代的方法是使用共享指针:std::shared_ptr<State> currState = std::make_shared<State::MainMenuState>();std::shared_pointer封装了裸指针,并引用了计数。

答案 1 :(得分:0)

除了@ PovilasB的答案,你还问过内部课程。您可以在C ++中使用内部类,但它不像Java那样常见。就个人而言,我不记得上次我在C ++中使用内部类时。