4

我有一个多态问题。

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 *
]

我还尝试了一些奇怪的东西,比如让参数成为指向向量的指针,然后像这样传递向量的地址:

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

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

3 回答 3

10

不存在多态向量之类的东西。An std::vector, 和 C++ 中的所有其他容器类型,包括 C 样式数组,始终只包含一种类型。并且两个不同的容器具有相关的类型这一事实不会使容器的类型以任何方式相关。

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

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

请注意,尝试将 astd::vector<DerivedClass*>用作 std::vector<BaseClass*>,例如使用 a reinterpret_cast,是未定义的行为,并且可能不起作用。不能保证对象中子对象的实际物理地址BaseClassDerivedClass完整对象具有相同的物理地址。

于 2013-06-24T10:01:12.607 回答
6

救援模板:

template<typename T>
void func(std::vector<T> A)
{
    ...
}
于 2013-06-24T09:46:44.527 回答
5

this is-a 的事实that并不意味着 a的集合this集合that

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

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

std::vector<SubClass*> B;

func(B); 

哎呀!B现在包含的东西不是指向 的指针SubClass,并且取消引用它的程序是未定义的。

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

于 2013-06-24T10:08:40.323 回答