首页 > 后端开发 > C++ > 正文

如何在 C 中安全地将 `unique_ptr` 从基类向下转换为派生类?

Susan Sarandon
发布: 2024-11-23 11:03:35
原创
743 人浏览过

How to Safely Downcast a `unique_ptr` from Base to Derived in C  ?

如何将 unique_ptr 从 Base 向下转换为 Derived

在面向对象编程中,通常使用类层次结构来表示实数 -世界概念。在 C 中,这通常是使用继承来完成的。继承允许派生类继承其基类的属性和行为。

使用类层次结构时的一个常见需求是将指向基类的指针转换为指向派生类的指针。这个过程称为向下转型。

在唯一指针的上下文中,向下转型可能有点棘手。这是因为唯一指针旨在防止悬空指针和其他内存问题。因此,您不能简单地使用 static_cast 将 unique_ptr 转换为其他类型。

相反,您必须使用以下方法之一:

1.静态唯一指针转换

当您确定唯一指针实际上包含指向派生类的指针时,可以使用此方法。以下函数模板可用于执行静态唯一指针转换:

template<typename Derived, typename Base, typename Del>
std::unique_ptr<Derived, Del>
static_unique_ptr_cast(std::unique_ptr<Base, Del> &&p) {
  auto d = static_cast<Derived *>(p.release());
  return std::unique_ptr<Derived, Del>(d, std::move(p.get_deleter()));
}
登录后复制

2.动态唯一指针转换

当您不确定唯一指针是否包含指向派生类的指针时,可以使用此方法。以下函数模板可用于执行动态唯一指针转换:

template<typename Derived, typename Base, typename Del>
std::unique_ptr<Derived, Del>
dynamic_unique_ptr_cast(std::unique_ptr<Base, Del> &&p) {
  if (Derived *result = dynamic_cast<Derived *>(p.get())) {
    p.release();
    return std::unique_ptr<Derived, Del>(result, std::move(p.get_deleter()));
  }
  return std::unique_ptr<Derived, Del>(nullptr, p.get_deleter());
}
登录后复制

示例

以下代码演示了如何使用静态唯一指针转换将 unique_ptr 转换为不同类型:

#include <memory>

class Base {
public:
  virtual ~Base() {}
};

class Derived : public Base {
public:
  ~Derived() {}
};

int main() {
  std::unique_ptr<Base> uptr = std::make_unique<Derived>();
  std::unique_ptr<Derived> dptr = static_unique_ptr_cast<Derived>(std::move(uptr));
  return 0;
}
登录后复制

在此示例中,我们创建一个 Base 的 unique_ptr 目的。然后,我们使用静态唯一指针转换将 unique_ptr 转换为派生对象的 unique_ptr。这是可能的,因为我们知道 Base 对象的 unique_ptr 实际上包含指向 Derived 对象的指针。

以上是如何在 C 中安全地将 `unique_ptr` 从基类向下转换为派生类?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板