2011-12-03 104 views
0

我無法讓std list類在類上調用正確的函數。它只會調用基類的函數。這裏發生的事情:在C++中繼承問題

我有被聲明在標題虛擬以下更新功能的狀態類:

State.h更新功能:

virtual void update(float elapsed); 

State.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! 

I th應該該行應該調用TestState中的更新函數,而是隻調用State類中的函數(即:它什麼都不做)。

有人可以解釋我如何獲得我正在尋找的功能嗎?

感謝

+0

如何聲明'states'列表? – ibid

回答

5

你應該在列表中存儲一個指針(或智能指針)你的對象,直接不是一個對象,或者你失去多態性。在

states->push_back(*state); 

你指示push_back構建的state副本,並在states添加副本。該副本的類型爲State,而不是TestState,因此其行爲方式不同。

此行爲被稱爲對象切片;例如參見this SO question

+0

謝謝,這很完美。 – Snukus