C ++:我可以在函数调用期间将向量<derived_class>转换为向量<base_class>吗?</base_class> </derived_class>

时间:2012-02-20 17:11:04

标签: c++ stl vector casting

我有一个现有的类和函数,如下所示:

Class base_class{
    ...
}

void Func(...,vector<base_class> &vec_b,...){
    // inside the function, the vector vec_b is being re-organized and re-sized
}

我定义了一个派生类,它看起来像:

Class derived_class: public base_class{
    ...
}

现在,在不更改功能Func的情况下,我可以将vector<derived_class>传递给Func,例如:

void main(){
    vector <derived_class> d;
    Func(...,d,...);
}

使得派生类d经历相同的重新组织和重新调整大小? 我知道我可以在一个函数调用中将派生类转换为基类而没有问题,但是一旦用一个向量进入游戏,似乎有困难吗?我无法在线找到答案,因此非常感谢任何建议或帮助。感谢。

5 个答案:

答案 0 :(得分:3)

没有。即使A是B,vector<A>也不是vector<B>

要传递一个代替另一个,可以传递指针向量(或使用Boost ptr_vector)。或者,您可以使用模板来传递任何提供正确界面的向量。

其中任何一个都需要改变你的功能 - 基本上没有办法避免这种情况(并且仍然提供你想要的功能)。

答案 1 :(得分:3)

这仅适用于使用指针的情况。

如果你没有使用指针,那么就有可能进行切片。例如

class Base {
  protected:
    int foo;
};

class Child : public Base {
    int bar;
};

class Base只包含一个名为foo的int,class Child包含两个整数foobar

Child f;
Base sliced = (Child)f;

这将对子进行切片,使其从对象中删除一些数据。您将无法将父级强制转换回子级,除非您使用指针。

因此,如果您将vector<>更改为指针而不是类的实例,那么您可以在父/子之间来回转换。

使用类似的东西:

vector<Base*> vec;
vec[0] = static_cast<Base*>(new Child());

...
Func(vec);
...

允许您将矢量成员强制转换为子类。

答案 2 :(得分:2)

不,你不能在不同类型的矢量之间进行转换。但是,您可以通过将Func设为模板来实现您要执行的操作。它可能不会要求您更改实际函数体中的任何代码,但这取决于您正在做什么。

template<typename T>
void Func(..., vector<T> &vec_b, ...){
    // inside the function, the vector vec_b is being re-organized and re-sized
}

答案 3 :(得分:2)

没有

您可以Func vector <base_class*> vector <base_class*>并让derived_class中的点元素指向{{1}}个实例。

答案 4 :(得分:0)

如果两个类具有不同的大小,则使用派生类的向量替换基类的向量将不起作用。这是因为向量在内部存储了类型的连续实例,因此基数向量会认为第二个元素位于与实际位置不同的位置。但是,您可以使用指针向量。