2011-02-27 129 views
7

假設DerivedClass派生自BaseClass
下面的工作是否會起作用?boost :: shared_ptr和分配派生類

boost::shared_ptr<BaseClass> a(new BaseClass()); 
boost::shared_ptr<DerivedClass> b(new DerivedClass()); 
a=b; 

在此之後question,據我所知,現在a指向派生和b指向基地(右?)

而且,現在如果我通過a調用一個函數會調用它的派生實現?

回答

13
... 
a=b; 

您重新分配到a,因此ab將現在都指向DerivedClass對象。對象將被銷燬,因爲它的引用計數此時將爲零(由於a被重新分配以指向不同的對象)。

由於a現在指向經由a將調用對應的成員函數DerivedClass一個DerivedClass對象,虛擬函數調用(在BaseClass定義和重寫在DerivedClass)。

ab超出範圍時,DerivedClass對象將被銷燬。

如果需要通過a(在DerivedClass例如,非虛擬函數)來訪問特定功能派生類,你可以使用:

boost::dynamic_pointer_cast<DerivedClass>(a)->SomeFunctionOnlyInDerivedClass(); 

當然這只是一個簡短的例子顯示使用。在產品代碼中,在取消引用指針之前,幾乎可以肯定地測試成功投射到DerivedClass

+1

'static_pointer_cast'也不能工作,因此是調用'DerivedClass'中非虛函數的首選方式嗎? '升壓:: static_pointer_cast 的(a) - > SomeFunctionOnlyInDerivedClass();' – j00hi 2012-03-03 18:43:15

4

假設DerivedClass來源於BaseClass。以下工作?

是的。正如有什麼不對

boost::shared_ptr<BaseClass> pbase(new DerivedClass()); 

(假設在兩種情況下是BaseClass的有虛析構函數)的智能指針的設計像一個普通的指針儘可能,並提供相同的行爲BaseClass* pbase = new DerivedClass();,加上所有終身管理的善良。

關注此問題,據我瞭解,現在a指向派生和b指向基地(右?)

否,A和B將都指向DerivedClass實例。鏈接文章引用的交換髮生在運營商內部的臨時對象上=。當該臨時對象超出作用域時,BaseClass實例將被刪除。

另外,現在如果我通過a調用函數,它會調用派生實現嗎?

是的。如果你看看操作符 - >實施,它的作用是返回指針,基本操作符 - >是被稱爲:

T * operator->() const // never throws 
{ 
    BOOST_ASSERT(px != 0); 
    return px; 
} 

,這樣的行爲是一樣的簡單的指針。

3

當你做a = b時,你告訴a指向的對象b也指向。因此,您調用的所有方法都是在對象b的BaseClass部分上指向的。

因此,如果它包含在DerviedClass中被覆蓋的虛擬方法,則調用覆蓋的版本。