为什么我的子类被认为是抽象类

Why is my sub class considered a abstract class?

本文关键字:认为是 抽象类 子类 我的 为什么      更新时间:2023-10-16

因此,对于我的下一个游戏,我将创建类来改进我的游戏架构我有一个名为GameState的抽象类,所有GameState(菜单、窗口、屏幕、游戏本身)都必须继承它才能添加到游戏中,但我的BlankState是对我的GameState设计的测试,这让我在编译器方面遇到了麻烦,因为出于某种原因,它被认为是一个抽象类,有人能告诉我为什么吗?我觉得我错过了一些非常明显的东西。

这是GameState.h的内容

#ifndef GUARD_GAMESTATE_H
#define GUARD_GAMESTATE_H
#include<SDL.h>
class Game;
class GameState {
protected:
    Game *m_pGame;
public:
    GameState( Game&  );
    virtual void load() = 0;
    virtual void handle_events( SDL_Event& events ) = 0;
    virtual void logic() = 0;
    virtual void draw() = 0;
    virtual void unload() = 0;
    virtual ~GameState() = 0;
};
class BlankState : public GameState {
private:
    SDL_Surface *background;
public:
    BlankState(Game& game);
    void load();
    void handle_events();
    void logic();
    void draw();
    void unload();
    ~BlankState();
};
#endif

这里是GameState.cpp,我在其中实现了GameState构造函数和BlankStates继承的方法

#include"GameState.h"
#include"Game.h"
#include"AssetLoader.h"

GameState::GameState(Game& game) {
    m_pGame = &game;
    m_pGame->addState(this);
}


BlankState::BlankState(Game& game)
        :GameState(game)
    {}

void BlankState::load() {
        background = AssetLoader::loadImage("assetsbackground.png");
}
void BlankState::handle_events() {}
void BlankState::logic() {}
void BlankState::draw() {
        SDL_Rect lol;
        lol.x = 0;
        lol.y = 0;
        SDL_BlitSurface(background, NULL, m_pGame->getSurface(), &lol);
}
void BlankState::unload() {
        SDL_FreeSurface(background);
}
BlankState::~BlankState() {}

提前感谢您的帮助

派生类中的void handle_events()函数与基类中应该重写的void handle_events(SDL_Event&)函数具有不同的签名。

编译器抱怨是因为派生类没有提供基类中声明的纯虚拟函数void handle_events(SDL_Event&)的实现。

换句话说,派生类是抽象的,编译器正确地拒绝实例化它

作为附加说明,在C++11中,您可以使用上下文关键字override来明确说明您要使成员函数覆盖基类中声明的虚拟函数的意图:

struct X
{
    virtual void foo(int) = 0;
};
struct Y : X
{
    virtual void foo(int) override { }
//                        ^^^^^^^^
//                        Makes it clear that this function is meant to
//                        override (and not just to hide) a virtual function 
//                        declared in the base class 
};
int main()
{
    Y y;
}

这样做的目的是,像你犯的错误很容易被发现。尝试override签名与基类中虚拟函数的签名不兼容的函数将触发编译错误:

struct X
{
    virtual void foo(int) = 0;
};
struct Y : X
{
    virtual void foo() override { } // ERROR!
    //                 ^^^^^^^^
    //                 X::foo has an incompatible signature
};
int main()
{
    Y y;
}