You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++如何隐藏类私有成员使用shared_ptr存储抽象类的实现

可行,但需要调整实现方式

你的需求完全可行,但当前代码的问题在于抽象类无法被实例化,而且直接拷贝基类引用会触发对象切片,丢失子类的具体信息。要解决这个问题,核心是让传入的具体Renderer子类实例能够复制出一份自身的副本,存入shared_ptr中。

解决方案:给抽象类添加克隆方法

在抽象基类Renderer中定义一个纯虚的clone方法,让每个子类实现该方法,返回指向自身实例的智能指针。这样Layer的构造函数就能通过调用这个方法,获取到具体子类的副本,存入私有成员中。

修改后的完整代码如下:

#include <memory>

class Renderer {
public:
    virtual void render() = 0;
    // 添加纯虚克隆方法,返回shared_ptr<Renderer>
    virtual std::shared_ptr<Renderer> clone() const = 0;
    // 基类需要虚析构函数,确保子类对象能正确销毁
    virtual ~Renderer() = default;
};

class GLRenderer : public Renderer {
public:
    void render() override {}
    
    std::shared_ptr<Renderer> clone() const override {
        // 返回当前GLRenderer实例的shared_ptr副本
        return std::make_shared<GLRenderer>(*this);
    }
};

class HeadlessRenderer : public Renderer {
public:
    void render() override {}
    
    std::shared_ptr<Renderer> clone() const override {
        return std::make_shared<HeadlessRenderer>(*this);
    }
};

class Layer {
public:
    Layer(const Renderer &renderer) {
        // 通过clone方法获取具体子类的shared_ptr
        m_Renderer = renderer.clone();
    }
private:
    std::shared_ptr<Renderer> m_Renderer; 
};

关键说明

  • 虚析构函数:必须给Renderer添加虚析构函数,否则当shared_ptr销毁对象时,只会调用基类的析构函数,导致子类资源泄漏。
  • 克隆方法的作用:clone方法由具体子类实现,确保复制的是子类自身的实例,避免对象切片问题,同时满足Layer内部用shared_ptr存储的需求。
  • 对外隐藏实现:外部调用Layer构造函数时,只需要传入任意Renderer子类的实例引用,完全不需要知道Layer内部用shared_ptr存储的细节,符合你的设计要求。

内容的提问来源于stack exchange,提问作者gsanta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 15:11:08