[英]boost::shared_ptr and assigning derived classes
假設DerivedClass
是從BaseClass
派生的
以下工作有效嗎?
boost::shared_ptr<BaseClass> a(new BaseClass());
boost::shared_ptr<DerivedClass> b(new DerivedClass());
a=b;
緊接着這個問題 ,我知道現在a
指向派生, b
指向基(對嗎?)
同樣,現在如果我通過調用一個函數a
它會調用派生實現?
...
a=b;
您正在重新分配給a
,因此a
和 b
現在都將指向DerivedClass
對象。 所述BaseClass
對象將被破壞,因為其引用計數將是在這一點上(借助於零a
reasigned到指向一個不同的對象的存在)。
由於a
現在指向DerivedClass
對象, DerivedClass
通過a
調用虛擬函數(在BaseClass
定義並在DerivedClass
重寫)將調用DerivedClass
的相應成員函數。
當a
和b
都超出范圍時, DerivedClass
對象將被破壞。
如果您需要訪問特定的功能通過派生類a
(在如非虛函數DerivedClass
),你可以使用:
boost::dynamic_pointer_cast<DerivedClass>(a)->SomeFunctionOnlyInDerivedClass();
當然,這只是顯示用法的簡潔示例。 在生產代碼中,幾乎可以肯定的是,在取消引用指針之前,必須測試是否成功將其DerivedClass
轉換為DerivedClass
。
假設
DerivedClass
是從BaseClass
派生的。 以下工作有效嗎?
是。 就像沒有錯一樣
boost::shared_ptr<BaseClass> pbase(new DerivedClass());
(在兩種情況下都假定BaseClass具有虛擬析構函數。)智能指針的設計目的是盡可能地表現為純指針,並提供與BaseClass* pbase = new DerivedClass();
相同的行為BaseClass* pbase = new DerivedClass();
,再加上所有終生管理優勢。
根據這個問題,我知道現在
a
指向派生,b
指向基(對嗎?)
不,a和b都指向DerivedClass實例。 鏈接的文章引用的交換發生在operator =內的一個臨時對象上。 當該臨時對象超出范圍時,將刪除BaseClass實例。
同樣,現在如果我通過調用一個函數
a
它會調用派生實現?
是。 如果看一下operator->的實現,它所做的只是返回要在其上調用基本operator->的指針:
T * operator-> () const // never throws
{
BOOST_ASSERT(px != 0);
return px;
}
因此其行為與普通指針相同。
當執行a = b時,您告訴a指向對象b也指向。 因此,您調用的所有方法都是在對象b指向的BaseClass部分上調用。
因此,如果它包含在DerviedClass中覆蓋的虛擬方法,則將調用覆蓋的版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.