c++ - 如何通过唯一指针获得多态行为?

标签 c++ c++11 stl smart-pointers

休息一段时间后开始使用 C++。

我有一个 std::vector 的唯一指针指向我迭代的对象,调用一个函数,该函数将 vector 中的对象从中作为参数的基类> 是派生的,像这样:

for (auto const& object : objects)
{
    _process(object);
}

objects 应该是:

std::vector<std::unique_ptr<Derived>>

我想了解如何执行多态行为来调用函数:

_process(std::unique_ptr<Base> base)

最佳答案

std::unique_ptr代表所有权,因此不能复制。

这意味着_process(std::unique_ptr<Base> base)是一个接收器,即它消耗对象(它可以销毁它或将它存储在某个地方,但调用者不再控制它)。为了调用它,您必须使用 std::move :

_process(std::move(object))

这样您就可以明确拒绝对象的所有权并将其从您的容器中删除 - 指针将重置为 nullptr .

当然,这只能通过非 const 来完成引用。

如果您不想转让所有权而只想对对象做一些事情 - 名称为 _process似乎暗示 - 你应该传递常规的原始指针:

_process(Base* base);
...
for (auto const& object : objects)
{
    _process(object.get());
}

除了控制对象的生命周期之外,原始指针仍然适用于所有方面。

在这两种情况下(原始指针和 unique_ptr )从 Derived 隐式转换绝对没有问题至 Base .

关于c++ - 如何通过唯一指针获得多态行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50996080/

相关文章:

c++ - 无效 C 风格强制转换后的方法调用

c++ - 使用 std::unique_ptr 时静态库中出现奇怪的 'missing import symbols'

c++ - 遍历 vector 会导致错误,但标准 for 循环不会

c++ - *(Pointer + Index) 和 Pointer[] 之间的区别

c++ - 是否有一个用于 std::set(或 std::map)的 STL 比较器,它带有提供基于值的查找的 shared_ptr 键? std::owner_less 究竟做了什么?

c++ - 将一段文本读入字符串 vector

c++ - 指针类型的 priority_queue 元素的排序

c++ - 链表内存读取错误

c++ - 为什么 std::shared_ptr<void> 工作

c++ - 命名空间 'atomic' 中没有名为 'std' 的类型