3

所以我有以下课程:

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,为什么会发生这种情况?

4

1 回答 1

5

虽然C派生自Astd::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.

于 2012-10-27T15:31:45.207 回答