2016-04-16 31 views
2

鑑於這樣的事情:的shared_ptr <Base>和對象從派生類

class Base {...}; 
class D1 : public Base {...}; 
class D2 : public Base {...}; 

在我的代碼,它是合法使用std::shared_ptr<Base>管理壽命和繞過的類型D1D2對象?或者這可能導致一個痛苦的世界?

回答

2

是的,它是完全沒問題的。智能指針被設計成轉儲指針的替代品。

當然,你必須考慮是否讓Base的成員函數virtual,就像你用啞指針一樣。

+0

「轉儲指針」?標準的新增加部分? ;) –

+0

@LightnessRacesinOrbit我猜*原始指針*將是在標準中定義的術語,但轉儲指針有一個更好的環:) – hgiesel

1

如果您的類是爲多態性設計的,那麼這非常好。

如果你的類不是多態的(即沒有虛擬成員),這個構造可能需要額外的工作(當你調用成員函數時,每個對象將被當作一個Base對象來處理)。在這種情況下,您最好在需要時使用std::shared_ptr<Base>,std::shared_ptr<D1>,std::shared_ptr<D2> ...和static_pointer_cast<>

+0

@KerrekSB好的,你可以通過刪除器克服非虛擬析構函數。儘管如此,對於任何非虛函數,如果要調用sp-> myfunction(),它總是爲Base :: myfunction(),除非顯式的單調乏味和容易出錯的向下轉換。 – Christophe

+0

@KerrekSB你是對的析構函數。我已經編輯了相應的答案。不過,我認爲其餘的依然有效。 – Christophe

0

如果下面是可以做到的

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. 

後此基礎上,我們用來共享指針可用於運行時多態性使用相同的原始指針。