鑑於這樣的事情:的shared_ptr <Base>和對象從派生類
class Base {...};
class D1 : public Base {...};
class D2 : public Base {...};
在我的代碼,它是合法使用std::shared_ptr<Base>
管理壽命和繞過的類型D1
和D2
對象?或者這可能導致一個痛苦的世界?
鑑於這樣的事情:的shared_ptr <Base>和對象從派生類
class Base {...};
class D1 : public Base {...};
class D2 : public Base {...};
在我的代碼,它是合法使用std::shared_ptr<Base>
管理壽命和繞過的類型D1
和D2
對象?或者這可能導致一個痛苦的世界?
是的,它是完全沒問題的。智能指針被設計成轉儲指針的替代品。
當然,你必須考慮是否讓Base的成員函數virtual
,就像你用啞指針一樣。
如果您的類是爲多態性設計的,那麼這非常好。
如果你的類不是多態的(即沒有虛擬成員),這個構造可能需要額外的工作(當你調用成員函數時,每個對象將被當作一個Base對象來處理)。在這種情況下,您最好在需要時使用std::shared_ptr<Base>
,std::shared_ptr<D1>
,std::shared_ptr<D2>
...和static_pointer_cast<>
。
@KerrekSB好的,你可以通過刪除器克服非虛擬析構函數。儘管如此,對於任何非虛函數,如果要調用sp-> myfunction(),它總是爲Base :: myfunction(),除非顯式的單調乏味和容易出錯的向下轉換。 – Christophe
@KerrekSB你是對的析構函數。我已經編輯了相應的答案。不過,我認爲其餘的依然有效。 – Christophe
如果下面是可以做到的
Base* ptr_base = new Derived()
那麼下面也應該是真實的
std::shared_ptr<Derived> ptr_derived = std::make_shared<Derived>();
std::shared_ptr<Base> ptr_base = ptr_derived;
// The shared pointer count is 2 as logically there are 2 handles to
// to the same memory object.
後此基礎上,我們用來共享指針可用於運行時多態性使用相同的原始指針。
「轉儲指針」?標準的新增加部分? ;) –
@LightnessRacesinOrbit我猜*原始指針*將是在標準中定義的術語,但轉儲指針有一個更好的環:) – hgiesel