我的程序中有上传和下传的问题。我有vector<Child>
传递给期望const vector<Parent>& pp
的函数。这里没有问题(编辑:显然有!见评论)。但是,现在我想将pp
传递给期望const vector<Child>& cc
的函数,这是我不能做的。
我应该怎么做,同时我不给功能修改原始类的能力?你能列出一些这样做的方法,最好是有利有弊吗?
答案 0 :(得分:4)
有一种叫做变种的东西。它有三种口味:
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
),这样您就赢了不必进行任何容器的铸造。
答案 1 :(得分:0)
即使Child
来自Parent
或反之,vector<Child>
和vector<Parent>
不相关,它们也是不同的类型。
答案 2 :(得分:0)
你可以有一个模板函数模板func(vector vec){//根据传递的对象类型做一些事情}。向量是对象的容器,因此对于期望向量&amp; pp的函数,如果我们传递向量&amp;&amp; pp。 cc将无法工作,代码甚至无法编译。 我们可以使用类似的代码:
class A
{
int i;
};
class B : public A
{
int j;
int k;
};
template<class T> void f(vector<T> &p)
{
//can handle both types now
}
int main()
{
B b1;
A a1;
vector<A> vectorA;
vectorA.push_back(a1);
vector<B> vectorB;
vectorB.push_back(b1);
f<B>(vectorB);
f<A>(vectorA);
return 0;
}