我在获取std list类以调用类上的正确函数时遇到了麻烦.它一直只调用基类的函数.这是发生了什么:
我有一个具有以下更新功能的状态类,在头中声明为虚拟:
State.h更新功能:
virtual void update(float elapsed);
Run Code Online (Sandbox Code Playgroud)
State.cpp更新功能:
void State::update(float elapsed){
};
Run Code Online (Sandbox Code Playgroud)
以及从它继承的一个名为TestState的类:
class TestState::public State{
virtual void update(float elapsed){
if (GLOBALENGINE->getInput() -> getKeyPress(DIK_Q)
PostQuitMessage(0);
};
};
Run Code Online (Sandbox Code Playgroud)
我调用addState函数将新状态添加到链表并使其成为当前状态,如下所示:
GLOBALENGINE->addState(new TestState,true);
Run Code Online (Sandbox Code Playgroud)
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 Code Online (Sandbox Code Playgroud)
然后每帧调用run()函数,其内部是以下代码:
currentState->update(elapsed)// This should call the update function in TestState!
Run Code Online (Sandbox Code Playgroud)
我认为这一行应该在TestState中调用update函数,而是只调用State类中的函数(即:它什么都不做).
有人可以解释我如何获得我正在寻找的功能吗?
谢谢
您应该在列表中存储指向对象的指针(或智能指针),而不是直接存储对象,否则会丢失多态性.在
states->push_back(*state);
Run Code Online (Sandbox Code Playgroud)
您正在指示push_back构建副本state并添加副本states.副本属于类型State,而不是TestState,因此行为方式不同.
此行为称为对象切片 ; 例如,看看这个问题.
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |