条款3:绝对不要以多态(polymorphically)方式处理数组
来源:互联网 发布:从淘宝进货在实体店卖 编辑:程序博客网 时间:2024/06/05 00:28
继承的最重要特性之一就是,你可以通过指向基类的指针或者引用来操作派生类对象。但是,如果你通过基类指针或者引用来操作派生类所形成的数组,它绝对不会按你预期地运行。
例子:
原因就是array[i]其实是一个指针算术表达式的简写,所代表的是*(array + i)。(array + i)与array之间的距离有多远?答案是i*sizeof(数组中的对象),因为基类的大小sizeof比派生类小,所以第二个运行出错了。
同样地,尝试通过一个基类指针删除由派生类对象组成的数组,那么上述问题会以另一种形式出现。Delete []array;操作会调用父类的析构函数,而不会调用派生类的析构函数。C++语言规范中说,通过基类指针删除一个由派生类对象组成的数组,结果是未定义的。
解决该问题的办法是,不要让一个具体类继承自另一个具体类,这样可以带来很多好处,可以参见条款33。
例子:
//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。
0 0
- 条款3:绝对不要以多态(polymorphically)方式处理数组
- 条款3:绝对不要以多态方式处理数组
- 条款3-4:绝对不要以多态的方式处理数组与default constructor
- 条款三:绝对不要以多态的方式处理数组
- 3.绝对不要以多态方式处理数组
- 读《More Effective C++35个改善编程与设计的有效方法》之条款3:绝对不要以多态方式处理数组
- 绝对不要以多态方式处理数组(More Effective c++)
- c++ 不要以多态的方式处理数组
- 不要以多态的方式处理数组
- 不要以多态的方式处理数组(More Effective-C++_3(基础))
- 《More effective C++》 中条款三 不要用多态方式处理数组以及数组的析构
- 《More Effective C++》学习心得(三) 不要以多态性处理类的对象数组
- More Effective C++ 读书笔记 之 不以多态方式处理数组
- 以多态的方式处理数组 产生的问题 实例代码
- 不要用多态方式处理数组以及数组的析构
- Item 3: Never treat arrays polymorphically.
- 绝对绝对不要TerminateThread
- 条款36:绝对不要重新定义继承而来的non-virtual函数
- DEV ImageComboxEdit 使用
- 教你如何迅速秒杀掉:99%的海量数据处理面试题
- BZOJ 2141 排队 树套树
- MFC的DLL
- 常用技术开发网站整理
- 条款3:绝对不要以多态(polymorphically)方式处理数组
- Java多线程——同步(二)
- mount 挂载重启不能保存问题—----修改/etc/fstab文件
- C语言学习总结
- 学习python第三天
- Java学习笔记-JVM内存管理
- Enabling export to csv button in web framework (SPLUNK)
- Python介绍
- 较详细的介绍JNI