簡體   English   中英

C ++:拋出派生的shared_ptr並捕獲基礎的shared_ptr嗎?

[英]C++: Throwing shared_ptr of derived and catching shared_ptr of base?

好吧,有人告訴我這個問題:為什么您可以將一個指向派生類的指針扔到它的基類上……但是您不能使用shared_ptrs做到這一點?

例如,這有效:

class Base {};
class Derived : public Base {};
int main()
{   
    try 
    {   
        throw new Derived() ;
    }   
    catch( const Base2 * b ) 
    {   
        printf("Received a base" ) ; 
    }   

    return 0 ;
}

但事實並非如此

int main()
{
    try
    {
        throw std::tr1::shared_ptr<Derived>( new Derived() ) ;
    }
    catch( const std::tr1::shared_ptr<Base> & b ) 
    {
        printf("Received a base" ) ;
    }
    return 0 ;
}

有任何想法嗎?

原因很簡單:即使derivedbase相關, shared_ptr<derived>shared_ptr<base>也無關,因此除非模板明確提供,否則不存在從隱式轉換為另一種的隱式轉換(並且本質上也是如此)以相同方式實例化的任何其他模板)。

但是,對於例外情況,我不確定您到底要解決什么問題。 通常,您想拋出一個對象(而不是指針),並且想要捕獲一個const引用。 由於您沒有任何可能擁有指向同一異常對象的多個指針,因此我不確定用shared_ptr<exception_object>解決什么問題。

您的第二個示例不起作用是正確的。

異常處理程序僅以非常明確定義的方式捕獲異常。 特別是,捕獲時不能進行隱式轉換。 僅應用派生到基礎和派生到指針到基礎的轉換。 由於shared_ptr<derived>不是從shared_ptr<base>派生的,並且它不是內置指針,因此不匹配。

如果要捕獲shared_ptr<base> ,則在拋出之前將其轉換為shared_ptr<base>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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