【问题标题】:Assign vector of children to vector of grandparents将孩子的向量分配给祖父母的向量
【发布时间】:2012-10-17 13:50:23
【问题描述】:

所以我有以下课程:

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&lt;_Ty&gt; *' 转换
'std::vector&lt;_Ty&gt; *' 指向的类型不相关;转换
需要reinterpret_cast、C 风格转换或函数风格转换

如果CA 的后代,为什么会发生这种情况?

【问题讨论】:

标签: c++


【解决方案1】:

虽然C 是从A 派生的,但std::vector&lt;C*&gt; 不是从std::vector&lt;A*&gt; 派生的,因此您不能将前一种类型的对象的地址分配给后者的指针。

想象一下,如果你能做到这一点,将会发生什么:

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

【讨论】:

  • 我感觉到一个最令人头疼的解析...不,你猜不是,看起来 C++ 检查 beginend 是否是类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
  • 2015-09-04
  • 2015-08-30
  • 2019-12-27
  • 2023-03-23
  • 2014-04-03
相关资源
最近更新 更多