2013-04-30 3 views
0

Я делаю игру, в игре есть список, в котором находится игрок, этот список относится к классу Player. У меня также есть класс, который является дочерним элементом игрока HumanPlayer. Я добавил игрока в список игроков. но когда я запускаю функцию рендеринга, она не выводится из humanplayer, которую она отображает у игрока. Функция рендеринга - это виртуальная функция, которая должна быть перезаписана, но это не так.Наследование C++ не работает

Вот где я определяю список:

std::list<Player> playerList; 

здесь, где я добавить humanplayer к списку:

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

Вы «нарезаете» http://stackoverflow.com/questions/274626/what-is-the-slicing-problem-in-c, для полиморфизма требуются «указатели». –

ответ

4

Вы делаете то, что она называется Slicing. Чтобы полиморфизм работал, вам необходимо использовать pointer s или reference s. Самое основное решение было бы использовать вместо pointer:

std::list<Player*> playerList; 

но теперь вам нужно управлять памятью и помнить delete все экземпляры вы создаете. Так как Коллин предложил вам использовать smart pointerstd::shared_ptr. Но в конечном итоге вам нужно решить, что имеет больше смысла для вашей проблемы.

+0

Использование указателей изменяет ряд вещей в его коде; в частности, будет только один случай каждого игрока, не так много. Очень маловероятно, что 'std :: unique_ptr' было бы уместным; 'std :: shared_ptr' _might_ be, но есть хорошая вероятность, что наиболее подходящий указатель является необработанным указателем. –

+0

@JamesKanze Спасибо, исправлены ответы –

0

Ваши объекты: sliced, так как вы сохраняете тип значения Player, а не указатель.

Попробуйте вместо этого:

std::list<std::unique_ptr<Player>> playerList; 
playerList.push_front(std::unique_ptr<Player>(new HumanPlayer(512,512, &playerList))); 
1

Во-первых - используйте указатели, во-вторых - не забудьте сделать ваши методы виртуальными.

+0

да, это было бы не изящно – 4pie0

Смежные вопросы