在C++中继承问题

Snu*_*kus 0 c++ inheritance

我在获取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类中的函数(即:它什么都不做).

有人可以解释我如何获得我正在寻找的功能吗?

谢谢

ibi*_*bid 5

您应该在列表中存储指向对象的指针(或智能指针),而不是直接存储对象,否则会丢失多态性.在

states->push_back(*state);
Run Code Online (Sandbox Code Playgroud)

您正在指示push_back构建副本state并添加副本states.副本属于类型State,而不是TestState,因此行为方式不同.

此行为称为对象切片 ; 例如,看看这个问题.