C++:使用抽象类的指针访问派生类的方法;派生类似乎也是抽象的

标签 c++ polymorphism abstract virtual-functions derived

我已经查找了 2 个小时(主要是在此站点上)以了解我在使用 C++ 编码时遇到的问题。我有一个抽象基类,如下所示:

屏幕.hpp

#include <SFML/Graphics.hpp>

class Screen {
public:
   virtual ~Screen();

   virtual void Init() const = 0;
   virtual void Render(sf::RenderWindow &window) const = 0;
   virtual void Update(sf::RenderWindow &window, sf::Time &deltaTime) const = 0;
   virtual void EventTriggered(sf::RenderWindow &window, sf::Event &event) const = 0;
};

接下来我声明了一个派生自基类的类:

启动画面.hpp

#include "Screen.hpp"

class Splashscreen : public Screen {
public:
   Splashscreen();
   ~Splashscreen();

   void Init();
   void Update(sf::RenderWindow &window, sf::Time &deltaTime);
   void Render(sf::RenderWindow &window);
   void EventTriggered(sf::RenderWindow &window, sf::Event &event);

private:
   sf::Sprite *_splashSprite;
};

最后我想创建一个新的 Splashscreen 对象并将地址分配给基类的指针:

void Game::Init() {
   Screen* ptrScreen = new Splashscreen;
   _displayMgr.AddScreen("Splash", ptrScreen);
   _displayMgr.ChangeScreen("Splash");
}

正如我之前提到的,我已经研究过这个问题并找到了大量的解决方案,并提出了我现在所拥有的。但是我仍然在该行中遇到错误

Screen* ptrScreen = new Splashscreen;

编译时说如下:

error: invalid new-expression of abstract class type 'Splashscreen'

我只是不明白这一点,因为我已经在这里定义了 Splashscreen.hpp 中提到的所有声明方法:

启动画面.cpp

#include "SplashScreen.hpp"

Splashscreen::Splashscreen() {}
Splashscreen::~Splashscreen() {}

void Splashscreen::Init() {}
void Splashscreen::Update(sf::RenderWindow &window, sf::Time &deltaTime) {}
void Splashscreen::Render(sf::RenderWindow &window) {}
void Splashscreen::EventTriggered(sf::RenderWindow &window, sf::Event &event) {}

我希望有人能帮助我并原谅我,如果这个问题已经很多次了。但是当你从 Java 转向 C++ 时,很难改变你的“编程思维”。但我已经更喜欢 C++ :) 它具有挑战性,我非常喜欢它。

[编辑]:

我只更改了以下内容:

class Splashscreen : public Screen {
public:
   Splashscreen();
   ~Splashscreen();

   void Init() const;
   void Update(sf::RenderWindow &window, sf::Time &deltaTime) const;
   void Render(sf::RenderWindow &window) const;
   void EventTriggered(sf::RenderWindow &window, sf::Event &event) const;

private:
   sf::Sprite *_splashSprite;
};

其他还是一样。

最佳答案

来自屏幕:

virtual void Init() const = 0;

来自 Splashscreen:

void Init();

其中一个是const,另一个不是。您应该从 Screen 中删除 const 或将其添加到 Splashscreen 中,以有意义的为准。

关于C++:使用抽象类的指针访问派生类的方法;派生类似乎也是抽象的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38032581/

相关文章:

c++ - 在 C++ 中分离声明和初始化

c++ - 访问类变量

c# - 将参数传递给基类构造函数

java - 获取鼠标事件不是抽象错误

c++ - "Is not a direct base of "gcc 4.5.2编译错误

c++ - 获取 wav 文件的帧和样本

c++ - 当操作的变量是 const 时,如何修复括号/索引运算符重载?

c++ - boost::shared_ptr <> "explicit shared_ptr( Y * p ): px( p ), pn()//Y must be complete"

java - 可以存储多种数据类型的变量

java - 我可以从抽象父类(super class)的方法访问在子类上定义的静态成员变量吗?