传递多态向量

时间:2013-06-24 09:45:17

标签: c++ polymorphism

我有一个多态问题。

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

std::vector< SubClass* > B;

func(B); //Compile error C2664 

我得到一个错误:

 error C2664 'func' : cannot convert parameter from 'std::vector<_Ty>' to 'std::vector<_Ty>' with
[
    _Ty=B *
]
and
[
    _Ty=A *
]

我也试过一些奇怪的东西,比如让参数成为一个指向vector的指针,我就像这样传递向量的地址:

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

std::vector< SubClass* > B;
func(&B); //same error  

3 个答案:

答案 0 :(得分:10)

没有多态矢量这样的东西。一个 std::vector,以及C ++中的所有其他容器类型,包括 C样式数组总是只包含一种类型。事实上 两个不同的容器具有相关的类型 没有以任何方式使容器的类型相关。

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

func( std::vector< BaseClass* >( B.begin(), B.end() ) );

请注意,尝试使用std::vector<DerivedClass*>作为 使用std::vector<BaseClass*>reinterpret_cast是 未定义的行为,可能无法正常工作。不能保证 中的BaseClass子对象的实际物理地址 DerivedClass对象具有与之相同的物理地址 完整的对象。

答案 1 :(得分:6)

拯救模板:

template<typename T>
void func(std::vector<T> A)
{
    ...
}

答案 2 :(得分:5)

this 是-a that的事实并不意味着this集合 that收集。

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

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

std::vector<SubClass*> B;

func(B); 

糟糕! B现在包含不是指向SubClass的指针,并且取消引用该程序的程序未定义。

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