c++ - 是否可以使shared_ptr协变?

标签 c++ shared-ptr smart-pointers covariance

我尝试制作以下示例。

struct BaseSPtr{};
struct DerivedSPtr : public BaseSPtr{};


class Base{
    public:
    //virtual shared_ptr<BaseSPtr> function();
    virtual BaseSPtr* function();    
};

class Derived : public Base
{
    public:
    //shared_ptr<DerivedSPtr> function() override;
    DerivedSPtr* function() override;
};

有人可以告诉我是否可以使 shared_ptr 的示例有效吗?

最佳答案

不幸的是,不,协变仅适用于 C++ 中的指针和引用。

要拥有类似的界面,您必须执行以下操作:

class Base{
public:
    std::shared_ptr<BaseSPtr> function() { return std::shared_ptr<BaseSPtr>(function_v()); }
private:
    virtual BaseSPtr* function_v();
};

class Derived : public Base
{
public:
    std::shared_ptr<DerivedSPtr> function() // Hides Base::function
    {
        return std::shared_ptr<DerivedSPtr>(function_v());
    }
private:
    DerivedSPtr* function_v() override; // Overrides Base::function_v
};

CRTP 可能有助于减少重复。

关于c++ - 是否可以使shared_ptr协变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60301118/

相关文章:

c++ - SSE g++ 编译问题

c++ - 具有成员函数和携带参数的构造函数的多线程

c++ - 带有自定义删除器的类成员唯一指针在初始化列表之外

c++ - 进入智能指针,如何处理代表所有权?

c++ - 使用 std::unique_ptr 反转二叉树

c++ - 模块 "MyShellExt.dll"加载失败

c++ - VS2013 C++ C1001 错误与 std::tuple_cat

c++ - 具有特定参数的仿函数的概念或特征?

c++ - 为什么我不能将shared_from_this 与回调接口(interface)对象一起使用?

c++ - 使用带有 std::array 作为参数的 std::make_shared 初始化 std::shared_ptr