2011-12-03 8 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! 

この行はTestStateのupdate関数を呼び出す必要がありますが、代わりにStateクラスの関数だけを呼び出します(つまり、何もしません)。

誰かが私が探している機能をどのように得ることができるか説明できますか?あなたは、リスト内のポインタ(またはスマートポインタ)あなたのオブジェクトに、直接ではなく、オブジェクトを格納する必要があります、またはあなたがポリモーフィズムを失う

おかげ

+0

'states'リストはどのように宣言されていますか? – ibid

答えて

5

states->push_back(*state); 

では、stateのコピーを作成し、statesにコピーを追加するpush_backに指示されています。コピーはではなく、TestStateであり、同様の動作をしません。

この動作は、オブジェクトスライシングと呼ばれます。たとえばthis SO questionを参照してください。

+0

ありがとう、これは完璧でした。 – Snukus