So I have the following classes:
class A {}
class B : public A {}
class C : public B {}
When I try do the following, I get an error:
vector<C*> v1; //already instantiated with a vector of pointers to C.
vector<A*>* v2 = &v1;
error C2440: 'initializing' : cannot convert from
'std::vector<_Ty> *'
to'std::vector<_Ty> *'Types pointed to are unrelated; conversion
requiresreinterpret_cast, C-style cast or function-style cast
If C is a descendant of A, why is this happening?
While C is derived from A, std::vector<C*> isn't derived from std::vector<A*>, so you can't assign the address of an object of the former type to a pointer for the latter.
Imagine what would become possible if you could do this:
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! */
However, of course the following is possible:
int main()
{
std::vector<C*> v1;
std::vector<A*> v2(begin(v1),end(v1));
return 0;
}
Here, we create a new vector v2 and copy the elements of v1 into it. This is possible because C is derived from A.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With