配列をポリモーフィックに扱うことはできません。C++ 言語ではサポートされていません。この式vec[x]
は、ポインター演算を使用して要素の位置を決定します。基本クラスのポインターを介してアクセスしている場合、オブジェクトのサイズが何らかの形で変化すると機能しません。
たとえば、サイズが 4 バイトの基本クラスがあり、サブクラスのサイズが 8 バイトであるとします。
base *a = new child[4];
アクセスa[1]
すると、コンパイラは基本クラスのサイズを使用してオフセットを計算します。この場合、オフセットは 4 バイトで、最終的に最初の要素の中央を指します。
適切なスマート ポインターでポインターstd::vector
またはポインターを使用することをお勧めします。std::array
// For arrays that needs to be resized (requires delete for each new)
std::vector<A*> vec(5, NULL);
for(int i = 0; i < vec.size(); i++)
{
vec[i] = new B();
}
// for arrays that are fixed in size (requires delete for each new)
std::array<A*, 5> vec;
for(int i = 0; i < vec.size(); i++)
{
vec[i] = new B();
}
// for arrays that are fixed in size with smart pointers
// no delete needed
std::array<std::unique_ptr<A>, 5> vec;
for(int i = 0; i < vec.size(); i++)
{
vec[i].reset(new B());
}