Проблема с наследованием в C ++ - PullRequest
0 голосов
/ 03 декабря 2011

У меня проблемы с получением класса списка std для вызова соответствующей функции в классе.Он продолжает вызывать только функцию базового класса.Вот что происходит:

У меня есть класс состояний со следующей функцией обновления, которая объявлена ​​виртуальной в заголовке:

Функция обновления State.h:

virtual void update(float elapsed);

СостояниеФункция обновления .cpp:

void State::update(float elapsed){

};

и наследующий от нее класс с именем TestState:

class TestState::public State{
        virtual void update(float elapsed){
             if (GLOBALENGINE->getInput() -> getKeyPress(DIK_Q)
                PostQuitMessage(0);
        };

};

Я вызываю функцию addState, чтобы добавить новое состояние в связанный список и сделать еготекущее состояние выглядит следующим образом:

GLOBALENGINE->addState(new TestState,true);

Функция addState выглядит следующим образом:

void GameEngine::addState(State *state, bool change){
    states->push_back(*state); //add the test state into the states list

    // some irrelevant code

    currentState = &(states->back());//currentState is a pointer to a State
    // So we make it point to the newly added state.


}

Тогда функция run () вызывается в каждом кадре, а внутри нее находится следующий код:

currentState->update(elapsed)// This should call the update function in TestState!

Я думал, что эта строка должна вызывать функцию обновления в TestState, но вместо этого она вызывает только функцию в классе State (то есть: она ничего не делает).

Может кто-нибудь объяснить, как я могу получить требуемую функциональность?

Спасибо

1 Ответ

5 голосов
/ 03 декабря 2011

Вы должны хранить в списке указатель (или умный указатель) на ваш объект, а не на объект напрямую, иначе вы потеряете полиморфизм. В

states->push_back(*state);

вы указываете push_back создать копию state и добавить копию в states. Копия имеет тип State, а не TestState, и, следовательно, не ведет себя так же.

Такое поведение называется объектом нарезка ; см. например этот вопрос SO .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...