c++ - 无法将父类(super class)转换为子类

标签 c++ inheritance rendering abstraction

我目前正在我的游戏和渲染引擎之间编写一个抽象层。不幸的是,我遇到了一个问题:我似乎无法将父类(super class)(抽象接口(interface))转换为子类(具体引擎的实现)。这是我的代码:

IIinitationSettings.h

class IInitationSettings {};

OxygineInitiationSettings.h

#include "IInitiationSettings.h"
#include "core/oxygine.h"
class OxygineInitiationSettings : public IInitationSettings, public oxygine::core::init_desc {
public:
    OxygineInitiationSettings(const char* title, bool vsync, bool fullscreen, int width, int height);
};

OxygineInitiationSettings.cpp

#include "OxygineInitiationSettings.h"
OxygineInitiationSettings::OxygineInitiationSettings(const char* title, bool vsync, bool fullscreen, int width, int height) : oxygine::core::init_desc() {
    this->title = title;
    this->vsync = vsync;
    this->fullscreen = fullscreen;
    this->w = width;
    this->h = height;
}

抽象初始化方法:

static void init(IInitiationSettings& initSettings);
void GraphicsFactory::init(IInitiationSettings& initSettings){
#ifdef USE_OXYGINE_RENDERING
    OxygineInitiationSettings settings = initSettings; //Does not work
    oxygine::core::init_desc desc = initSettings; // Does not work
    oxygine::core::init((oxygine::core::init_desc)((OxygineInitiationSettings)initSettings)); //Does not work
#endif
}

如何将抽象接口(interface)转换为具体实现?我也想添加一个新的 InitiationSettings-Method,它将返回一个 IInitiationSettings 对象,我将把它传递给 init 方法,以便获得干净的代码。 (我希望我的游戏代码看起来像这样:

GraphicsFactory::init(GraphicsFactory::newInitiationSettings(args));

)

有什么想法吗?

最佳答案

这里的根本错误是试图在您的抽象 init 方法中将对象本身转换为不同的类型。向上转换(即朝向基类)导致 object slicing ,因为它只复制基类的数据。这通常很糟糕,但向下转换可能是不可能的。所以编译器不会让你。

您真正想做的是在引用或指针级别工作。粗略地说,引用是指针的语法糖,指向对象的指针可替代指向其基类之一的指针。这就是为什么您可以通过 base& 类型的参数传递 derived。但是,当您尝试取回您的 derived 时,您必须请求 derived&derived*。在您的情况下,这看起来更像是其中之一:

static_cast<OxygineInitiationSettings&>(initSettings) // or
dynamic_cast<OxygineInitiationSettings&>(initSettings)

或者,如果你需要一个指针,也许是这样的:

static_cast<OxygineInitiationSettings*>(&initSettings) // or
dynamic_cast<OxygineInitiationSettings*>(&initSettings)

如果您确定 initSettings 将引用 OxygineInitiationSettings 实例,您可以而且应该使用 static_cast 而不是 dynamic_cast 。如果您不确定,您应该变得确定或使用 dynamic_cast 而不是 static_cast。请注意,动态引用转换将引发 std::bad_cast 异常,如果 initSettings 引用的实际对象实际上不是,则动态指针转换将返回空指针OxygineInitiationSettings

关于c++ - 无法将父类(super class)转换为子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30150115/

相关文章:

c++ - 无法使用 const char * 数组实例化模板

c++ - C++中如何获取listview的值

c++ - 使用我的结构作为返回类型的问题

Java继承子类和父类(super class)

3d - GPU:将浮点顶点坐标转换为定点。如何?

c++ - 为在 OpenGL 中使用基本物理和渲染寻找一个好的形状类设计

ggplot2 - gganimate 返回 .png 文件,但没有动画对象

c++ - 错误 : initializer fails to determine size of ‘K’

c++ - Arduino:在 Stream 对象上调用 serial.begin()

c# - 在 C# 中,如何从子类访问基类变量值