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*
。关于类型安全性,这是一个很好的观点。(无论类型安全问题如何,都有技术原因导致其无法实施,但类型安全问题意味着即使可能也不应实施。)