为什么我的子类被认为是抽象类
Why is my sub class considered a abstract class?
因此,对于我的下一个游戏,我将创建类来改进我的游戏架构我有一个名为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;
}
相关文章:
- 抽象类错误,请参阅声明" "是抽象的
- 无法实例化抽象类,但类不是抽象/派生方法的参数
- 抽象类/接口中的空方法是否被认为是一种好的做法?
- 错误 - 变量类型 "X" 是一个抽象类 - c++
- 如何构建一个 Map,其中键是抽象基类(而不是值)
- 我在代码中有一个错误,错误是:(智能感知:不允许抽象类类型"HourlyWorker"的对象:)
- C++ 指向类的指针和/或引用是否被认为是"movable"?
- 确保派生的类实现至少是来自抽象类(C )的两种方法之一
- 派生类仍然是抽象的
- 为什么我的课被认为是抽象的
- 抽象类的需求是什么?为什么要通过其基类访问派生类方法?在C++
- 确实被认为是实验性的 - 静态反射功能包括对母类的迭代
- 返回 std::p air<const CustomClass &, bool> 用于搜索函数中的失败情况,当 CustomClass 是抽象基类时
- 基于模板的成员初始化,其中模板是抽象类的派生
- 不明白为什么这个类被认为是抽象类
- 为什么编译器认为这个类是抽象的(C++)
- 为什么我的派生类是抽象类?C++
- 为什么我的子类被认为是抽象类
- 它是抽象类还是纯虚拟(接口)
- 一个没有纯虚方法的c++类可以被认为是抽象的吗?