對於智能指針本身它取決於智能指針。指向Derived
的智能指針不是從Base
那種智能指針派生的類。 但您可以投射原始指針。對於你有static_cast
如果你知道指針對象是派生類型,併爲dynamic_cast
當你不知道(或者只是希望檢查)和基類是多態。
注:如果原始指針downcasted所有權的假設可以被打破,然後用來構建一個新的智能指針。對於這種情況,原始智能指針的所有權應該首先被釋放。通常這是一個稱爲release
的成員函數。
例如:
#include <iostream>
#include <memory>
struct Base
{
int x;
};
struct Derived
: Base
{
void foo() const { std::cout << x << "\n"; }
Derived(int const value): Base{ value } {}
};
auto main()
-> int
{
using std::unique_ptr;
unique_ptr<Base> p_base{ new Derived{ 42 } };
#ifdef CHECK
unique_ptr<Derived> p_directly_converted{ p_base }; // !Nyet
#endif
unique_ptr<Derived> p_derived{
static_cast<Derived*>(p_base.release())
};
p_derived->foo();
}
std::unique_ptr
不具有相關聯的功能執行此垂頭喪氣,所以它必須通過手動或者static_cast
或dynamic_cast
來完成(對於多態性鹼基),加release
。
然而,std::shared_ptr
具有相關功能static_pointer_cast
,dynamic_pointer_cast
和const_pointer_cast
,以及其他智能指針可能同上功能–但這在很大程度上取決於智能指針。
關閉,選民們應該注意,這個問題是不是'shared_ptr'。這個詞沒有提到。 –