如何将 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中文网其他相关文章!