【问题标题】:pure virtual function has no overrider [closed]纯虚函数没有覆盖器[关闭]
【发布时间】:2019-03-05 02:13:22
【问题描述】:

谁能帮帮我?

我现在有这个问题,无法解决。

不允许抽象类类型的对象:纯虚函数没有覆盖器'

我在下面突出显示:

class State 
{ 
public:
    virtual void Update() = 0;
    virtual void Render();
    virtual void Enter() = 0;
    virtual void Exit() = 0;
    virtual void Resume() = 0;
protected:
    State() {} 
};

class GameState : public State
{
private:
    Level level;
    Level levels[5] = { Level(3), Level(1), Level(1), Level(2), Level(1) };
    const char* levelNames[5] = { "Level1.txt", "Level2.txt", "Level3.txt", "Level4.txt", "Level5.txt" };
    SDL_Texture* tileText;
    SDL_Texture* playerText;
    Player player;
    SDL_Surface* tileSurf;
    SDL_Surface* playerSurf;

    int m_iTickCtr = 0;
    int m_iTickMax = 1; // for animation

public:
    GameState() {}
    void Update(Level& l, Player& p, int& c) ; // Level& level, Player& player, int& c
    void Render(Level& l, Player& p);
    void Enter();
    void Exit();
    void Resume() { cout << "Resuming Game..." << endl; }
    enum sfx { jump, boom, laser };
};

class TitleState : public State
{
public:
    TitleState() {}
    virtual void Update();
    void Render();
    void Enter(); 
    void Exit();
    void Resume() {}
    enum btn { play, exit };
private: 
    vector<Button*> m_vButtons;
};

void TitleState::Update()
{
    /*
    if (Game::Instance()->KeyDown(SDL_SCANCODE_B) == 1)
        Game::Instance()->GetAM()->PlaySound(sfx::boop);
    */
    for (int i = 0; i < (int)m_vButtons.size(); i++)
        m_vButtons[i]->Update();
    // Parse buttons.
    if (m_vButtons[btn::play]->Clicked())
        Game::Instance()->GetFSM()->ChangeState(new GameState()); // here 'GameState' has problems.
    else if (m_vButtons[btn::exit]->Clicked())
        Game::Instance()->DoQuit();
}

【问题讨论】:

  • 是的,因为GameState 没有实现几个抽象函数,所以您不能使用new 或任何其他方式构造GameState 对象的新实例;那么,您要问的抽象(又名纯虚拟)方法的基本属性到底是什么?仅通过观察显示的代码,GameState 无法实现 Update()Render(),因此要么实现它们,要么创建一些其他实现它们的对象。就是这样。
  • 你应该用override注释你所有的覆盖,然后你会很快发现问题。
  • 不要忘记 C++ 中的优秀函数重载:void Update()void Update(Level&amp;, Player&amp;, int&amp;)不同的函数。在GameState 中将override 说明符添加到您的函数中会受益匪浅。

标签: c++ virtual


【解决方案1】:

在您的子类GameState 中,您必须为void Update() 创建一个覆盖函数,该函数在抽象类State 中定义为纯虚函数。

也许您认为您这样做了,因为您创建了void Update(Level&amp; l, Player&amp; p, int&amp; c),但由于此函数的签名与void Update() 不同,因此它不会覆盖它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-04
    • 2021-09-30
    • 2020-08-21
    • 2022-01-13
    • 2014-05-22
    • 1970-01-01
    • 2014-03-08
    • 2018-03-08
    相关资源
    最近更新 更多