条款3:绝对不要以多态(polymorphically)方式处理数组

        继承的最重要特性之一就是,你可以通过指向基类的指针或者引用来操作派生类对象。但是,如果你通过基类指针或者引用来操作派生类所形成的数组,它绝对不会按你预期地运行。
例子:
//BalancedBST继承于BST类
void printBSTArray(ostream& s, const BST array[], int numElements)
{
	for(int i = 0; i < numElements; i++){
		s << array[i];
	}
}

BST bstArray[10];
BST bbstArray[10];
printBSTArray(cout, bstArray, 10);    //可以正常运行
printBSTArray(cout, bbstArray, 10);   //运行异常
        为什么第二个会运行异常?
        原因就是array[i]其实是一个指针算术表达式的简写,所代表的是*(array + i)。(array + i)与array之间的距离有多远?答案是i*sizeof(数组中的对象),因为基类的大小sizeof比派生类小,所以第二个运行出错了。
        同样地,尝试通过一个基类指针删除由派生类对象组成的数组,那么上述问题会以另一种形式出现。Delete []array;操作会调用父类的析构函数,而不会调用派生类的析构函数。C++语言规范中说,通过基类指针删除一个由派生类对象组成的数组,结果是未定义的。
        解决该问题的办法是,不要让一个具体类继承自另一个具体类,这样可以带来很多好处,可以参见条款33。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值