2016-08-03 106 views
1

代碼:如何將基礎智能指針投射到C++中的派生指針?

class Base { 
    ... 
}; 

class Derived : public Base { 
    void OnlyOwnedByDerived{ 
     ... 
    } 
}; 

的問題是:1。 如果我使用的基類的智能指針引用派生一個,爲什麼我這樣做的原因是,我想要得到的動態利益綁定只適合虛擬功能。但是如果我想要使用僅由派生類擁有的的函數,我該怎麼辦? static_cast不同類的智能指針之間給我一個錯誤...

  • 最直接的方法,我可以想出是使用原始指針,而不是聰明的一...
  • +0

    關閉,選民們應該注意,這個問題是不是'shared_ptr'。這個詞沒有提到。 –

    回答

    4

    在C++ 11,有dynamic_pointer_cast

    ,您可以使用:

    void func(std::shared_ptr<Base> b){ 
        b->VirtualBaseFunction(); 
        if(auto d = dynamic_pointer_cast<Derived>(b)){ 
         d->DerivedSpecificFunction(): 
         ....more code 
        } 
    } 
    
    3

    通過使用std::dynamic_pointer_cast。如果演員不成功,這將返回一個空的shared_ptr

    您可能還可以直接通過智能指針管理的指針使用dynamic_cast,如果你不希望返回派生的指針之間共享的所有權信息:

    smart_ptr_type<Base> x = ...; 
    auto* derived = dynamic_cast<Derived*>(x.get()); 
    
    +0

    我沒有看到僅限於'shared_ptr'的約束;我甚至沒有看到它提到。正如問題所述,這至多是一個評論。在'shared_ptr'的情況下...... –

    +0

    因爲沒有足夠的信息,我必須做出一些假設。由於標準庫中的所有智能指針類型都可以轉換爲shared_ptr,因此可以將其視爲「最低公分母」。如果他們使用boost,那麼這應該給他們足夠的信息來定位'boost :: dynamic_pointer_cast'。歡迎您提出更具體的信息並自己回答問題。 – Yuushi

    0

    對於智能指針本身它取決於智能指針。指向Derived的智能指針不是從Base那種智能指針派生的類。 但您可以投射原始指針。對於你有static_cast如果你知道指針對象是派生類型,併爲dynamic_cast當你不知道(或者只是希望檢查)和基類是多態。

    注:如果原始指針downcasted所有權的假設可以被打破,然後用來構建一個新的智能指針。對於這種情況,原始智能指針的所有權應該首先被釋放。通常這是一個稱爲release的成員函數。

    例如:

    #include <iostream> 
    #include <memory> 
    
    struct Base 
    { 
        int x; 
    }; 
    
    struct Derived 
        : Base 
    { 
        void foo() const { std::cout << x << "\n"; } 
        Derived(int const value): Base{ value } {} 
    }; 
    
    auto main() 
        -> int 
    { 
        using std::unique_ptr; 
        unique_ptr<Base> p_base{ new Derived{ 42 } }; 
    
        #ifdef CHECK 
         unique_ptr<Derived> p_directly_converted{ p_base };  // !Nyet 
        #endif 
    
        unique_ptr<Derived> p_derived{ 
         static_cast<Derived*>(p_base.release()) 
         }; 
        p_derived->foo(); 
    } 
    

    std::unique_ptr不具有相關聯的功能執行此垂頭喪氣,所以它必須通過手動或者static_castdynamic_cast來完成(對於多態性鹼基),加release

    然而,std::shared_ptr具有相關功能static_pointer_castdynamic_pointer_castconst_pointer_cast,以及其他智能指針可能同上功能–但這在很大程度上取決於智能指針。