抽象类的c++继承

C++ inheritance for abstract classes

本文关键字:继承 c++ 抽象类      更新时间:2023-10-16

我对c++有点陌生,想知道如何解决继承问题。

我有通用的开放框架应用程序,BaseApp,然后MainApp,在BaseApp框架的具体实现。

一个应用程序可以渲染一个全屏图层并缓冲另一个图层用于过渡。图层也从BaseLayer类扩展,像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);
    }

有没有更干净的方法来完成这个?我一直试图坚持的风格,它有尽可能少的指针,所以一个层是一个POD类。

我建议添加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

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

在c++中只有两种处理运行时多态对象的方法——通过指针或通过引用。引用似乎不适合您的设计,所以您只能使用指针。如果您不喜欢指针,请重新设计以避免使用运行时多态性。