抽象的 C++ 继承 类

C++ inheritance for abstract classes

我对 C++ 有点陌生,正在尝试找出如何用继承解决问题。

我有通用的 Open Frameworks 应用、BaseApp,然后是 MainApp,它是 BaseApp 中框架的特定实现。

应用程序可以呈现全屏图层并缓冲另一个图层以进行过渡。层也从 BaseLayer class 扩展,就像 BaseApp 在扩展之前什么都不做。

所以

class BaseApp : public ofBaseApp {
    public:
        BaseLayer renderLayer;
        BaseLayer bufferedLayer;
}
// ...
class MainApp : public BaseApp {
    public:
        VideoLayer videoLayer; // Video + Image layers extend BaseLayer
        ImageLayer imageLayer;
}

我想做的是说我的 renderLayer 是我的 imageLayer,我的 bufferedLayer 是我的 videoLayer,即:renderLayer = (some class which extends layer) 所以在我的 BaseApp 中我可以把它当作一个 BaseLayer 而在我的MainApp我可以把它当作一个VideoLayer,ImageLayer等

我最终用 shared_ptr 完成了这个,它看起来很脏,但有效:

class BaseApp : public ofBaseApp {
    public:
        shared_ptr<BaseLayer> renderLayer;
}

// inside MainApp.setup()
    renderLayer = make_shared<ImageLayer>();
    if (shared_ptr<ImageLayer> imageLayer = dynamic_pointer_cast<ImageLayer>(renderLayer)){
        // ImageLayer specific setup
        imageLayer->setup("assets/tiger.png",0,0,800,600);
    }

是否有更简洁的方法来完成此操作?我一直在尝试坚持 oF 风格,它的指针越少越好,所以一个 Layer 就是一个 POD class.

我不确定你为什么需要 shared_pointer,一个简单的 unique_pointer 就可以了。

在 C++ 中只有两种处理 运行 时间多态对象的方法 - 通过指针或通过引用。 参考文献似乎不适合您的设计,因此您只能使用指针。如果您不喜欢指针,请重新设计以不使用 运行 时间多态性。

我建议添加virtual函数来获取渲染层和缓冲层。

class BaseApp : public ofBaseApp {
    public:
        virtual BaseLayer& getRenderLayer() = 0;
        virtual BaseLayer& getBufferedLayer() = 0;
};

// ...
class MainApp : public BaseApp {
    public:

        virtual BaseLayer& getRenderLayer() { return imageLayer;}
        virtual BaseLayer& getBufferedLayer() { return videoLayer; }

    private:
        VideoLayer videoLayer; // Video + Image layers extend BaseLayer
        ImageLayer imageLayer;
};

在适当的地方添加 const