资源预览内容
第1页 / 共3页
第2页 / 共3页
第3页 / 共3页
亲,该文档总共3页全部预览完了,如果喜欢就下载吧!
资源描述
MoreEffectiveC+:不使用多态性数组class BalancedBST: public BST . ; 在一个真实的程序里,这样的类应当是模板类,但是在这个例子里并不重要,加上模板只会使得代码更难阅读。为了便于争论,我们假设BST和BalancedBST只包含int类型数据。 有这样一个函数,它能打印出BST类数组中每一个BST对象的内容: void printBSTArray(ostream i numElements; ) s arrayi; /假设BST类 /重载了操作符 当你传递给该函数一个含有BST对象的数组变量时,它能够正常运行: BST BSTArray10; .printBSTArray(cout, BSTArray, 10); / 运行正常 然而,请考虑一下,当你把含有BalancedBST对象的数组变量传递给printBSTArray函数时,会产生什么样的后果: BalancedBST bBSTArray10; .printBSTArray(cout, bBSTArray, 10); / 还会运行正常么? 你的编译器将会毫无警告地编译这个函数,但是再看一下这个函数的循环代码: for (int i = 0; i numElements; ) s arrayi; 这里的arrayI只是一个指针算法的缩写:它所代表的是*(array)。我们知道array是一个指向数组起始地址的指针,但是array中各元素内存地址与数组的起始地址的间隔毕竟有多大呢?它们的间隔是i*sizeof(一个在数组里的对象),由于在array数组0到I间有I个对象。编译器为了建立正确遍历数组的执行代码,它必需能够确定数组中对象的大小,这对编译器来说是很简单做到的。参数array被声明为BST类型,所以array数组中每一个元素都是BST类型,因此每个元素与数组起始地址的间隔是be i*sizeof(BST)。 至少你的编译器是这么认为的。但是假如你把一个含有BalancedBST对象的数组变量传递给printBSTArray函数,你的编译器就会犯错误。在这种状况下,编译器原先已经假设数组中元素与BST对象的大小全都,但是现在数组中每一个对象大小却与BalancedBST全都。派生类的长度通常都比基类要长。我们料想BalancedBST对象长度的比BST长。假如如此的话,printBSTArray函数生成的指针算法将是错误的,没有人知道假如用BalancedBST数组来执行printBSTArray函数将会发生什么样的后果。不管是什么后果都是令人不开心的。
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号