分类: C/C++
2009-04-02 20:50:01
|
运行结果:
print Based Array : 1 1 1 1 1 1 1 1 1 1
print Derive Array : 1 -858993460 1 -858993460 1 -858993460 1 -858993460 1 -858993460
Press any key to continue
在printArray(ostream& s, const BasedClass array[], int numElements)函数中,array[i]是一个"指针算术表达式"的简写,它代表:*(array+i)。array所指内存和array+i地址相距i*sizeof(数组中的对象)。这是在编译期间编译器决定的。而在传入派生类对象数组后,array中各对象指针距离就改变了(除非派生类没有增加任何东西),但是编译期显然并没有这么认为,所以结果令人无法预料。
同样的,多态方式删除数组一样会有问题。
void deleteArray((BasedClass array[])
{
delete[] array;
}
当数组被删除时,数组中每一个元素的destructor都必须被调用,当编译器看到delete[] array;这行代码必须产生出类似下列的代码:
//将*array中的对象以其构造次序的相反次序进行析构
for(int i = the number of elements in the array - 1; i >= 0; --i)
{
array[i].BasedClass::~BasedClass(); //调用array[i]的destructor
}