2013-07-02 140 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是的,我确定。 –