将std :: unique_ptr转换为std :: unique_ptr到超类的正确方法是什么?

时间:2013-08-23 00:40:07

标签: c++ c++11

假设我有一个名为foo的类,它继承自名为bar的类。

我有一个std::unique_ptr foo的实例,我希望将其传递给只需要std::unique_ptr<bar>的函数。如何转换指针使其在我的函数中起作用?

4 个答案:

答案 0 :(得分:27)

您可以将std::unique_ptr<foo>右值转换为std::unique_ptr<bar>

std::unique_ptr<foo> f(new foo);
std::unique_ptr<bar> b(std::move(f));

显然,指针将由b拥有,如果b被破坏,bar需要有virtual析构函数。

答案 1 :(得分:2)

由于继承,不需要任何特殊内容。您需要使用std::move将unique_ptr传递给函数,但即使类型匹配也是如此:

#include <memory>

struct A {
};

struct B : A {
};

static void f(std::unique_ptr<A>)
{
}

int main(int,char**)
{
  std::unique_ptr<B> b_ptr(new B);
  f(std::move(b_ptr));
}

答案 2 :(得分:0)

您可以使用以下语法:

std::unique_ptr<parent> parentptr = std::unique_ptr<child>(childptr);

或者您可以使用std::move

另一个选项是发出原始指针,但是你需要更改一个函数:

void func(const parent* ptr)
{
  // actions...
}
func(*childptr);

这是一篇关于智能指针并将其传递给函数的好文章:http://herbsutter.com/2013/06/05/gotw-91-solution-smart-pointer-parameters

答案 3 :(得分:-1)

你不能,因为它违反了最基本的unique_ptr规则:必须只有一个实例拥有一个给定的指针,unique_ptr拥有它的完全所有权(当它超出范围,指针被删除)。

正如您所见,

unique_ptr<T>unique_ptr<U>(其中U : T)不兼容。

对于shared_ptr,您可以拥有多个实例,std::static_pointer_cast的行为与static_cast类似,只是它接受shared_ptr并返回另一个(并且都指向同一个对象)。

如果您绝对需要使用unique_ptr,则必须先创建一个函数,该函数首先将当前unique_ptr视为新的,并将该指针置于正确类型的新指针中。在函数调用之后,您可能还需要进行相反的转换。