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

What is the correct way to convert a std::unique_ptr to a std::unique_ptr to a superclass?

本文关键字:ptr 转换 unique std 方法 是什么 超类      更新时间:2023-10-16

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

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

您可以将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析构函数。

由于继承,不需要任何特殊内容。 您需要使用 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));
}
您可以使用

以下语法:

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。

你不能

,因为它会违反最基本的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,并将该指针放入正确类型的新指针中。您可能还需要在函数调用后执行相反的转换。