我尝试制作以下示例。
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/