簡體   English   中英

boost :: shared_ptr並分配派生類

[英]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的相應成員函數。

ab都超出范圍時, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM