【M3】绝对不要以多态方式处理数组
1、考虑下面的情况,有个方法,如下:
void Print(ostream& s, const Base array[], int size)
{
for(int i=0; i< size; ++i)
{
s<<array[i];
}
}
2、对于Base baseArray[10]; Print(cout, baseArray, 10) 没有问题。在C++中,子类对象组成的数组,可以复制给父类的引用或者指针。数组名也可以认为是个地址。
考虑: Derived derivedArray[10]; Print(cout, derivedArray, 10) 会发生什么事?
我们知道array[i] 其实就是 *(array +i ); 也就是移动i个单元,解引用。编译器必须知道移动多少个字节,既然方法声明中为父类数组,移动的字节就是 i*sizeof(Base).
当我们把子类对象组成的数组,传递给Print方法的时候,编译器还是按照 i*sizeof(Base)的方式移动。由于子类对象往往比父类对象大,造成的结果不可预期。
3、考虑方法
deleteArray(Base array[])
{
delete [] array;
}
delete [] array做的事情是:逆序对每个元素执行析构方法 Base::~Base(); 并且释放内存。当我们把子类对象组成的数组,传递给deleteArrayt方法的时候,编译器还是按照上面的方式处理,这必然导致未定义的行为。
4、结论就是:绝对不要以多态方式处理数组。
【M3】绝对不要以多态方式处理数组的更多相关文章
- C++以多态方式处理数组可能会遇到的问题
今天读<More Effective C++>时遇到一个条款:绝对不要以多态方式处理数组.以前自己也没有注意过,觉得有必要记录下来. C++是允许通过base class的指针或引用来操作 ...
- 【More Effective C++ 条款3】最好不要以多态方式处理数组
1.在数组与多态混用的情况下,数组元素的访问会出现不可预期的结果(因为数组元素的访问会使用到下标运算) 将一个子类对象数组传递给一个父类对象数组声明的函数,编译器会允许这个行为,但是由于子类对象和父类 ...
- 在ASP.NET MVC中以post方式传递数组参数的示例
最近在工作中用到了在ASP.NET MVC中以post方式传递数组参数的情况,记录下来,以供参考. 一.准备参数对象 在本例中,我会传递两个数组参数:一个字符串数组,一个自定义对象数组.这个自定义对象 ...
- URL 通过Get方式传递数组参数
URL 通过Get方式传递数组参数 方法1: ?id=1&id=2&id=3 后台获取时,只需要reqeust.getParameterValues("id") 获 ...
- 出于性能考虑,C语言自动地以传地址的方式将数组传递给被调函数 const 编译错误 最小权限原则
#include <stdio.h> int main(void) { char array[5]; printf("array=%p,&array[0]=%p,& ...
- 在ASP.NET MVC中以post方式传递数组参数的示例【转】
最近在工作中用到了在ASP.NET MVC中以post方式传递数组参数的情况,记录下来,以供参考. 一.准备参数对象 在本例中,我会传递两个数组参数:一个字符串数组,一个自定义对象数组.这个自定义对象 ...
- 用最复杂的方式学会数组(Python实现动态数组)
Python序列类型 在本博客中,我们将学习探讨Python的各种"序列"类,内置的三大常用数据结构--列表类(list).元组类(tuple)和字符串类(str). 不知道你发现 ...
- 以forin的方式遍历数组时进行删除操作的注意点
今天在修改某项需求的时候,需要在遍历的时候将匹配项移除掉,采用的时forin的方式遍历,然后运行的时候却crash掉了 for (NSString*str in self.btnArray) { if ...
- [汇编语言]-第七章 用[bx+idata]的方式进行数组的处理
1- 转化为大写 方法一: assume cs:code,ds:data data segment db 'BaSiC' db 'MinIX' data ends code segment start ...
随机推荐
- poj 3160 Father Christmas flymouse
// 题目描述:从武汉大学ACM集训队退役后,flymouse 做起了志愿者,帮助集训队做一些琐碎的事情,比如打扫集训用的机房等等.当圣诞节来临时,flymouse打扮成圣诞老人给集训队员发放礼物.集 ...
- ORACLE 全局索引和本地索引
Oracle数据库中,有两种类型的分区索引,全局索引和本地索引,其中本地索引又可以分为本地前缀索引和本地非前缀索引.下面就分别看看每种类型的索引各自的特点. 全局索引以整个表的数据为对象建立索引,索引 ...
- mysql违背了唯一约束
执行一批数据,违背唯一约束时会中断,导致后面的数据写不进去. mysql有提供ignore关键字,使用insert ignore into .... 这样,当违背了唯一约束的时候~就会直接跳过,不会报 ...
- (3)Spring定时任务的几种实现
Spring定时任务的几种实现 近日项目开发中需要执行一些定时任务,比如需要在每天凌晨时候,分析一次前一天的日志信息,借此机会整理了一下定时任务的几种实现方式,由于项目采用spring框架,所以我都将 ...
- Java与WCF交互(一):Java客户端调用WCF服务
最近开始了解WCF,写了个最简单的Helloworld,想通过java客户端实现通信.没想到以我的基础,居然花了整整两天(当然是工作以外的时间,呵呵),整个过程大费周折,特写下此文,以供有需要的朋友参 ...
- group by调优的一些测试
表结构信息: mysql> show create table tb\G*************************** 1. row ************************** ...
- 搞明白这八个问题,Linux系统就好学多了。
正在犹豫入坑Linux学习的同学或者已经入坑的同学,经常会问到这样八个问题.今天,这些问题我都会一一解答,希望我的看法能帮助各位同学.常言道“好的开始是成功的一半”,如果你明白了以下八个问题,就能有一 ...
- 3. 使用绘图API自定义视图 --- 旋转的方块
import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; impor ...
- 《Nagios系统监控实践》勘误
在翻译的过程中,虽然反反复复的检查了很多遍,但依然有所遗漏——这不,今天就收到了 @我是晓梦 的回复,指出了书中的一些错误. 从今天起,建立勘误表,记录这些错误,以便在下一次印刷时纠正,并对广大读者致 ...
- cxf 动态创建客户端,局域网能正常调用服务端,外网不能访问