传递多态载体
passing a polymorphic vectors
本文关键字:多态 更新时间:2023-10-16
我有一个多态性问题。
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
的指针,并且一个取消引用它的程序是未定义的。
您需要制作一个具有正确类型的副本、使用模板或重构,这样就不需要到处传递集合。
相关文章:
- 多态性和功能结合
- 具有默认模板参数的多态类的模板推导失败
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 多态二进制函数
- 访问存储在向量C++中的结构的多态成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 将 std::allocate_shared 与多态资源分配器一起使用
- 通过switch和static_cast访问多态对象的运行时类型
- C++boost序列化多态性问题
- 多态杆件变量 - 类设计
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- Doees the 'this' 指针参与虚函数的多态行为
- C++ 在堆栈中包含多态属性的类对象存储
- 基类和派生类的多态赋值运算符
- 转身多态对象
- 如何在基类指针向量的元素上应用重载的多态函数
- 具有智能指针的多态性
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- C++事件系统 - 多态事件和事件处理程序