如何获得具有唯一指针的多态行为?

时间:2018-06-22 21:59:37

标签: 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)

1 个答案:

答案 0 :(得分:3)

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都应该没有问题。