书上举了个例子:
class BST{ ... };
class BalanceBST : public BST{ .... };
/*在一个真正具规模的程序中,这样的classes可能会被设计为templates。*/
void printBSTArray( ostream& s, const BST array[], int numElements)
{
for( int i=0; i < numElements; ++i )
s << array[i];
}
表达式1:
BST BSTArray[10];
.....
printBSTArray( cout, BSTArray, 10 );
表达式2:
BalanceBST bBSTArray[10];
.......
printBSTArray( cout, bBSTArray, 10);//可以正常运行吗?
array[i] 等价于 *(array+i) 那么array和array+i之间的距离就是array+i*sizeof(BST)
显然sizeof(BST) != sizeof(BalanceBST),表达式2会出错。
尝试通过一个base class指针,删除一个由derived class objects组成的数组。
void deleteArray( ostream& logStream, BST array[] )
{
logStream<<"Deleting array at address "<< static_cast<void*>(array)<<"\n";
delete[] array;
}
BalanceBST *balTreeArray = new BalanceBST[10];
....
deleteArray( cout, balTreeArray );
delete[] array;
for( int i= the number of elements in the array -1; i >=0; --i)
{
array[i].BST::~BST();
}
C++规范中说,通过base class指针删除一个由derived classes objects构成的数组,其结果未定义。
绝对不要以多态方式处理数组
最新推荐文章于 2024-04-25 10:58:58 发布