27

我对 c++11 指针有疑问。具体来说,如何将基类的唯一指针转换为派生类?

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()

我最终导致可执行文件崩溃。

在此先感谢,任何建议将不胜感激。

4

1 回答 1

47

如果它们是多态类型并且您只需要一个指向派生类型的指针,请使用dynamic_cast

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

如果它们不是多态类型,则只需要一个指向派生类型的指针,static_cast并希望获得最好的结果:

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

如果需要转换unique_ptr包含多态类型的a:

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()));
于 2013-07-02T05:22:33.777 回答