在C ++中继承问题

时间:2011-12-03 07:44:14

标签: c++ inheritance

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

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

由于

1 个答案:

答案 0 :(得分:5)

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

states->push_back(*state);

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

此行为称为对象切片;例如,见this SO question