绝对不要以多态方式处理数组

书上举了个例子:

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构成的数组,其结果未定义。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值