MoreEffectiveC++:不使用多态性数组.docx

上传人:cn****1 文档编号:543853700 上传时间:2023-10-25 格式:DOCX 页数:3 大小:12.60KB
返回 下载 相关 举报
MoreEffectiveC++:不使用多态性数组.docx_第1页
第1页 / 共3页
MoreEffectiveC++:不使用多态性数组.docx_第2页
第2页 / 共3页
MoreEffectiveC++:不使用多态性数组.docx_第3页
第3页 / 共3页
亲,该文档总共3页,全部预览完了,如果喜欢就下载吧!
资源描述

《MoreEffectiveC++:不使用多态性数组.docx》由会员分享,可在线阅读,更多相关《MoreEffectiveC++:不使用多态性数组.docx(3页珍藏版)》请在金锄头文库上搜索。

1、 MoreEffectiveC+:不使用多态性数组class BalancedBST: public BST . ; 在一个真实的程序里,这样的类应当是模板类,但是在这个例子里并不重要,加上模板只会使得代码更难阅读。为了便于争论,我们假设BST和BalancedBST只包含int类型数据。 有这样一个函数,它能打印出BST类数组中每一个BST对象的内容: void printBSTArray(ostream i numElements; ) s arrayi; /假设BST类 /重载了操作符 当你传递给该函数一个含有BST对象的数组变量时,它能够正常运行: BST BSTArray10; .p

2、rintBSTArray(cout, BSTArray, 10); / 运行正常 然而,请考虑一下,当你把含有BalancedBST对象的数组变量传递给printBSTArray函数时,会产生什么样的后果: BalancedBST bBSTArray10; .printBSTArray(cout, bBSTArray, 10); / 还会运行正常么? 你的编译器将会毫无警告地编译这个函数,但是再看一下这个函数的循环代码: for (int i = 0; i numElements; ) s arrayi; 这里的arrayI只是一个指针算法的缩写:它所代表的是*(array)。我们知道arra

3、y是一个指向数组起始地址的指针,但是array中各元素内存地址与数组的起始地址的间隔毕竟有多大呢?它们的间隔是i*sizeof(一个在数组里的对象),由于在array数组0到I间有I个对象。编译器为了建立正确遍历数组的执行代码,它必需能够确定数组中对象的大小,这对编译器来说是很简单做到的。参数array被声明为BST类型,所以array数组中每一个元素都是BST类型,因此每个元素与数组起始地址的间隔是be i*sizeof(BST)。 至少你的编译器是这么认为的。但是假如你把一个含有BalancedBST对象的数组变量传递给printBSTArray函数,你的编译器就会犯错误。在这种状况下,编译器原先已经假设数组中元素与BST对象的大小全都,但是现在数组中每一个对象大小却与BalancedBST全都。派生类的长度通常都比基类要长。我们料想BalancedBST对象长度的比BST长。假如如此的话,printBSTArray函数生成的指针算法将是错误的,没有人知道假如用BalancedBST数组来执行printBSTArray函数将会发生什么样的后果。不管是什么后果都是令人不开心的。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号