所以我有以下课程:
class A {}
class B : public A {}
class C : public B {}
当我尝试执行以下操作时,出现错误:
vector<C*> v1; //already instantiated with a vector of pointers to C.
vector<A*>* v2 = &v1;
错误C2440:'初始化':无法转换为
'std::vector<_Ty> *'
到'std::vector<_Ty> *'
指向的类型是不相关的;转换
需要reinterpret_cast
,C风格的演员或函数式演员
如果C
是A
的后代,为什么会发生这种情况?
答案 0 :(得分:4)
虽然C
来自A
,但std::vector<C*>
并非来自std::vector<A*>
,因此您无法将前一类型的对象的地址分配给vector<A*>* v2 = &v1;
/* *v2 is declared as a vector<A*> so we can do this: */
v2->push_back(new B);
/* Now we have effectively added a pointer to a B object
to the vector v1, which is supposed to be a vector of
C objects only! */
后者的指针。
想象一下,如果你能做到这一点会变成什么:
int main()
{
std::vector<C*> v1;
std::vector<A*> v2(begin(v1),end(v1));
return 0;
}
但是,当然可以采取以下措施:
v2
在这里,我们创建了一个新的向量v1
,并将C
的元素复制到其中。这是可能的,因为A
源自{{1}}。