C++ C++;:我可以投射向量吗<;派生类>;到向量<;基本类>;在函数调用期间?

C++ C++;:我可以投射向量吗<;派生类>;到向量<;基本类>;在函数调用期间?,c++,stl,vector,casting,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 } 现在,在不更改函数Func的情况下,我可以将向量传递到Func,例如: void main(){ vector <

我有一个已存在的类和函数,如下所示:

Class base_class{
    ...
}

void Func(...,vector<base_class> &vec_b,...){
    // inside the function, the vector vec_b is being re-organized and re-sized
}
现在,在不更改函数
Func
的情况下,我可以将
向量
传递到
Func
,例如:

void main(){
    vector <derived_class> d;
    Func(...,d,...);
}
void main(){
载体d;
Func(…,d,…);
}
使派生类
d
经历相同的重新组织和重新调整大小?
我知道我可以在函数调用中将派生类强制转换为基类,这没有问题,但一旦有了向量,似乎就有困难了?我无法在网上找到答案,因此非常感谢您的任何建议或帮助。谢谢。

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

不,您不能在不同类型的向量之间转换。但是,您可以通过将
Func
制作为模板来实现您的目标。它可能不需要您更改实际函数体中的任何代码,但这取决于您正在做什么

template<typename T>
void Func(..., vector<T> &vec_b, ...){
    // inside the function, the vector vec_b is being re-organized and re-sized
}
模板
void Func(…,向量和向量b,…){
//在函数内部,向量vec_b正在重新组织和调整大小
}

否。即使A是B,A
向量也不是
向量

要传递一个而不是另一个,可以传递指针向量(或使用Boost ptr_向量)。或者,您可以使用模板来允许传递提供正确接口的任何内容的向量

但是,这两种情况都需要更改您的功能——基本上无法避免这一点(并且仍然提供您想要的功能)。


您可以让
Func
获取
向量
,并让
向量
中的点元素指向
派生类
实例。

这仅在使用指针时有效

如果您没有使用指针,那么就有可能发生切片。例如

class Base {
  protected:
    int foo;
};

class Child : public Base {
    int bar;
};
class Base
只包含一个名为
foo
的int,而
class Child
包含两个int,
foo
bar

Child f;
Base sliced = (Child)f;
这将对子对象进行切片,使其从对象中删除一些数据。除非使用指针,否则无法将父类强制转换回子类

因此,如果您将
向量
更改为具有指针而不是类的实例,则可以在父/子对象之间来回转换

使用类似于:

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

...
Func(vec);
...
vec;
vec[0]=静态_cast(new Child());
...
Func(vec);
...

将允许您将向量的成员强制转换到它们的子类中

向量是通过值而不是指针来保存对象的,所以无论如何都不能有多态行为。例如,重点是什么?与:。有点相关的事情:我发现这个复杂的问题很容易理解。OP说“不改变函数。”这不需要更改func吗?您确定可以在这里传递指针向量吗?@BartekBanachewicz:a
向量
不能转换为
向量
——但是
向量
中的指针可以指向基对象或派生对象。但是,如果您从一个
向量开始,则在将其传递给函数之前,您需要将这些指针复制到
向量中。哦,我现在明白您的意思了。
vector<Base*> vec;
vec[0] = static_cast<Base*>(new Child());

...
Func(vec);
...