我的程序中的上下转换有问题。我有一个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
),因此您无需执行任何容器转换。