gpt4 book ai didi

c++ - 向下转型 `vector`

转载 作者:搜寻专家 更新时间:2023-10-31 01:01:10 25 4
gpt4 key购买 nike

我在程序中遇到向上转型和向下转型的问题。我有一个 vector<Child>传递给期望 const vector<Parent>& pp 的函数.到目前为止没有问题(编辑:显然有!请参阅评论)。但是,现在我想通过 pp到期望 const vector<Child>& cc 的函数,这是我做不到的。

我应该怎么做,同时又不赋予函数修改原始类的能力?您能否列出执行此操作的各种方法,最好列出它们的优缺点?

最佳答案

有一种东西叫做变异。它有 3 种口味:

  • 不变 - 尽管 B延伸A , T<B>不延伸T<A> ,
  • 协变 - 当B延伸A , 然后 T<B>延伸T<A> ,
  • 逆变 - 当B延伸A , 然后 T<A>延伸T<B> .

当涉及到 C++ 模板时,您最终会遇到不变性。尽管名字看起来一样:vector<Parent>vector<Child>这是两种不同的类型。

如果您查看编译器生成的内容,它们都对可能具有不同大小的类型进行操作。由于 C++ 依赖于对象大小的知识(例如,当它计算对象在数组中的位置时)类型,例如Child[]无法转换为 Parent[]因为某些对象的位置可能计算错误。出于同样的原因,模板以不变的方式运行:编译器无法猜测何时会以及何时执行此类转换是不安全的。

所以这取决于您解决这个问题,您在这里有一些选择。一种方法是制作也采用该参数模板的函数:

template<T>
void performAction(vector<T> objects) {
// ...
}

其他人会用(智能)指针替换值 - 他们会轻松处理多态性。

编辑:

要说明我在最后一句话中的意思:您可以简单地使用 vector< unique_ptr<Parent> >vector< shared_ptr<Parent> >存储 Parent 的任何实例(包括 Child ),因此您无需对容器进行任何转换。

关于c++ - 向下转型 `vector<Parent>`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29643258/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com