[英]Is it possible to make shared_ptr covariant?
我嘗試制作以下示例。
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 可能有助於減少重復。
現在的問題是你如何使用Derived
類?
function()
?function()
在第一種情況下,只需提供具有不同名稱的函數,然后您可以在需要派生類的指針時調用此函數。
在第二種情況下,您不應該嘗試說服編譯器您返回派生類,因為多態調用無論如何都會隱藏它。
在最后一種情況下,只需將 CRTP 用作其他建議的答案(有些人稱之為靜態多態性)並刪除 virtual 關鍵字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.