我无法获取std list类来调用类上的正确函数。它一直只调用基类的函数。这是正在发生的事情:
我有一个具有以下更新功能的状态类,在标题中声明为虚拟:
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 :(得分:5)
您应该在列表中存储指向对象的指针(或智能指针),而不是直接存储对象,否则会丢失多态性。在
states->push_back(*state);
您指示push_back
构建state
的副本,并在states
中添加副本。副本的类型为State
,而不是TestState
,因此行为方式不同。
此行为称为对象切片;例如,见this SO question。