您不能多态地处理数组,C++ 语言不支持它。该表达式vec[x]
使用指针算法来确定元素的位置。如果您通过基类指针访问它,那么如果对象的大小以任何方式发生变化,它将不起作用。
例如,您的基类大小为 4 个字节,子类大小为 8 个字节。
base *a = new child[4];
当您访问时a[1]
,编译器会使用基类的大小来计算偏移量。在这种情况下,偏移量是 4 个字节,最终指向第一个元素的中间。
我建议将 a std::vector
or std::array
of 指针与适当的智能指针一起使用。
// 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());
}