我的程序中的上下转换有问题。我有一个vector<Child>,传递给需要const vector<Parent>& pp的函数。到这里为止没有问题(编辑:显然有!请参见注释)。但是,现在我想将pp传递给需要const vector<Child>& cc的函数,而我不能这样做。

我应该如何做,而同时我却不赋予函数修改原始类的能力?您能否列出各种方法,最好是各有利弊?

最佳答案

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

  • 不变-即使B扩展了AT<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),因此您无需执行任何容器转换。

    09-10 02:48
    查看更多