我有一个现有的类和函数,如下所示:
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
经历相同的重新组织和重新调整大小?
我知道我可以在一个函数调用中将派生类转换为基类而没有问题,但是一旦用一个向量进入游戏,似乎有困难吗?我无法在线找到答案,因此非常感谢任何建议或帮助。感谢。
答案 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
包含两个整数foo
和bar
。
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)
如果两个类具有不同的大小,则使用派生类的向量替换基类的向量将不起作用。这是因为向量在内部存储了类型的连续实例,因此基数向量会认为第二个元素位于与实际位置不同的位置。但是,您可以使用指针向量。