带派生类的std :: unique_ptr

Luk*_*mit 19 c++ pointers c++11

我有一个关于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?
Run Code Online (Sandbox Code Playgroud)

它应该是可能的,但我无法弄清楚如何.每次我尝试使用

basePointer.get()
Run Code Online (Sandbox Code Playgroud)

我最终得到了可执行文件崩溃.

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

Cap*_*ous 38

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

Derived *derivedPointer = dynamic_cast<Derived*>(basePointer.get());
Run Code Online (Sandbox Code Playgroud)

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

Derived *derivedPointer = static_cast<Derived*>(basePointer.get());
Run Code Online (Sandbox Code Playgroud)

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

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

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

std::unique_ptr<Derived>
    derivedPointer(static_cast<Derived*>(basePointer.release()));
Run Code Online (Sandbox Code Playgroud)

  • @Marc安全的原因是因为`release()`和`reset()`都是`noexcept`,所以除非你在这个函数之外做一些非常糟糕的事情,否则原始指针总是会在派生指针中结束将被正确销毁. (2认同)
  • @Masadow:如果这不是您想要的,那么您就不需要*唯一的*指针。 (2认同)
  • 答案有问题。是的,static_cast 也支持多态类型。仅当您不确定强制转换是否有效时才应该使用dynamic_cast(在这种情况下,测试它是否像您一样返回null)。 (2认同)