2013-07-02 138 views
8

我有一個關於C++ 11指針的問題。具體來說,如何將基類的唯一指針轉換爲派生類?std :: unique_ptr派生類

class Base 
{ 
public: 
    int foo; 
} 

class Derived : public Base 
{ 
public: 
    int bar; 
} 

... 

std::unique_ptr<Base> basePointer(new Derived); 
// now, how do I access the bar member? 

它應該是可能的,但我無法弄清楚如何。每次我嘗試使用

basePointer.get() 

我最終崩潰了可執行文件。

在此先感謝,任何意見將不勝感激。

+2

你能表明使你的進程崩潰的代碼的完整(但最少)的例子嗎? 'basePointer.get()'當然不是問題。 – jogojapan

+0

@jogojapan我解決了我的問題。我做了一些非常奇怪的演員,至少有5組括號。我很確定這只是一些愚蠢的行爲,但我已經改變了它,不記得我做了什麼。儘管隊長Obvlious的答案爲我工作。感謝你的幫助! –

回答

22

如果他們是多態類型,你只需要一個指向派生類型使用dynamic_cast

Derived *derivedPointer = dynamic_cast<Derived*>(basePointer.get()); 

如果不是多態類型只需要一個指向派生類型使用static_cast和最好的希望:

Derived *derivedPointer = static_cast<Derived*>(basePointer.get()); 

如果需要轉換unique_ptr含有多態類型:

Derived *tmp = dynamic_cast<Derived*>(basePointer.get()); 
std::unique_ptr<Derived> derivedPointer; 
if(tmp != nullptr) 
{ 
    basePointer.release(); 
    derivedPointer.reset(tmp); 
} 

如果你需要轉換unique_ptr含非多態類型:

std::unique_ptr<Derived> 
    derivedPointer(static_cast<Derived*>(basePointer.release())); 
+0

謝謝,這對我有用! –

+0

當你做basePointer.release()時,你確定沒有內存泄漏嗎? – Marc

+0

@Marc是的,我確定。 –