0

我正在制作一个游戏,在游戏中有一个包含玩家的列表,这个列表涉及 Player 类。我还有一个类,它是 Player 的一个孩子,叫做 HumanPlayer。我在玩家列表中添加了一个人类玩家。但是当我运行渲染函数时,它不会从humanplayer 渲染,而是从播放器渲染。render 函数是一个虚函数,应该被覆盖,但不是。

这是我定义列表的地方:

std::list<Player> playerList;

这是我在列表中添加人类玩家的地方:

playerList.push_front(HumanPlayer(512,512,&entityList));

这是渲染函数调用渲染的地方:

if(!playerList.empty()){
    std::list<Player>::iterator iter;
    for (iter = playerList.begin(); iter != playerList.end(); iter++){
       iter -> render(canvas);
    }
 }
4

3 回答 3

4

你正在做所谓的Slicing。为了使多态性起作用,您需要使用pointers 或references。最基本的解决方案是使用 apointer代替:

std::list<Player*> playerList;

但是现在您需要管理内存并记住delete您创建的所有实例。因此,正如 Collin 建议您could使用某种smart pointerlike std::shared_ptr。但最终你需要决定哪个对你的问题更有意义。

于 2013-04-30T17:24:14.050 回答
1

首先 - 使用指针,其次 - 不要忘记让你的方法是虚拟的。

于 2013-04-30T17:24:17.113 回答
0

您的对象正在被切片,因为您存储的是值类型Player而不是指针。

试试这个:

std::list<std::unique_ptr<Player>> playerList;
playerList.push_front(std::unique_ptr<Player>(new HumanPlayer(512,512, &playerList)));
于 2013-04-30T17:23:39.650 回答