传递多态载体

  • 本文关键字:多态 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 *
]

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

void func(std::vector< BaseClass* > *A){}
std::vector< SubClass* > B;
func(&B); //same error  

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

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

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

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

救援模板:

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

this是一个that这一事实并不意味着this集合that的集合。

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

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

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

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

最新更新