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その要素をコピーしますv1Cから派生しているため、これが可能ですA

于 2012-10-27T15:31:45.207 に答える