向下转换`vector <parent>`</parent>

时间:2015-04-15 06:41:34

标签: c++ class downcast

我的程序中有上传和下传的问题。我有vector<Child>传递给期望const vector<Parent>& pp的函数。这里没有问题(编辑:显然有!见评论)。但是,现在我想将pp传递给期望const vector<Child>& cc的函数,这是我不能做的。

我应该怎么做,同时我不给功能修改原始类的能力?你能列出一些这样做的方法,最好是有利有弊吗?

3 个答案:

答案 0 :(得分:4)

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

  • invariation - 即使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),这样您就赢了不必进行任何容器的铸造。

答案 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;
}