C++ 传递多态向量

C++ 传递多态向量,c++,polymorphism,C++,Polymorphism,我有一个多态性问题 void func(std::vector< BaseClass* > A){} std::vector< SubClass* > B; func(B); //Compile error C2664 void func(std::vectorA){ std::vectorB; func(B)//编译错误C2664 我得到这样一个错误: error C2664 'func' : cannot convert parameter from 's

我有一个多态性问题

void func(std::vector< BaseClass* > A){}

std::vector< SubClass* > B;

func(B); //Compile error C2664 
void func(std::vectorA){
std::vectorB;
func(B)//编译错误C2664
我得到这样一个错误:

 error C2664 'func' : cannot convert parameter from 'std::vector<_Ty>' to 'std::vector<_Ty>' with
[
    _Ty=B *
]
and
[
    _Ty=A *
]
void func(std::vector< BaseClass* > *A){}

std::vector< SubClass* > B;
func(&B); //same error  
错误C2664'func':无法将参数从'std::vector'转换为'std::vector'
[
_Ty=B*
]
和
[
_Ty=A*
]
我还尝试了一些奇怪的东西,比如让参数成为指向向量的指针,然后像这样传递向量的地址:

 error C2664 'func' : cannot convert parameter from 'std::vector<_Ty>' to 'std::vector<_Ty>' with
[
    _Ty=B *
]
and
[
    _Ty=A *
]
void func(std::vector< BaseClass* > *A){}

std::vector< SubClass* > B;
func(&B); //same error  
void func(std::vector*A){
std::vectorB;
func&B//同样的错误

救援模板:

template<typename T>
void func(std::vector<T> A)
{
    ...
}
模板
void func(标准::向量A)
{
...
}

没有多态性载体。一 <代码> STD::vector < /C> >,C++中的其他容器类型,包括 C样式数组始终只包含一种类型。事实呢 两个不同的容器具有相关的类型 不会使容器的类型以任何方式相关

在您的情况下,您可能需要构造第二个向量:

func( std::vector< BaseClass* >( B.begin(), B.end() ) );
func(std::vector(B.begin(),B.end());
请注意,尝试使用
std::vector
作为
std::vector
,比如说,通过使用
重新解释
未定义的行为,可能不起作用。这不能保证
中
基类
子对象的实际物理地址
DerivedClass
对象与
完整对象

事实上,
这个
是一个
那个
并不意味着一个
这个
的集合就是一个
那个
的集合

考虑一下如果你想要的东西被允许会发生什么:

void func(std::vector<BaseClass*>& A)
{
    A.push_back(new BaseClass);
}

std::vector<SubClass*> B;

func(B); 
void func(标准::向量&A)
{
A.推回(新基类);
}
std::载体B;
func(B);
哎呀
B
现在包含的东西不是指向
子类的指针,而取消引用它的程序是未定义的


您需要使用正确的类型制作副本、使用模板或重构,这样就不需要传递集合。

您希望能够将
vector
传递给期望
vector
的函数吗?我打赌你不会的。在你的例子中也是一样,真的-类型是不相关的。为什么你需要std::vector?您可以始终将子类*放在基类*中。这会降低类型安全性(用duck类型替换静态类型检查,如果您传递了无效类型,则会产生非常奇怪的错误消息),并且需要将
func
的实现放在头文件中,从而增加耦合。如果
func
非常简单且非常稳定,那就没关系了,但在其他情况下应该避免。请注意,OP似乎是以另一种方式工作的,他们有一个
Base*
的向量,并尝试获得一个
Derived*
@jrok的向量。请重新阅读他的帖子。他有一个
DerivedClass*
类型的向量
B
,他想调用一个函数
func
,该函数的向量为
BaseClass*
。关于类型安全性,这是一个很好的观点。(无论类型安全问题如何,都有技术原因导致其无法实施,但类型安全问题意味着即使可能也不应实施。)