博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【M3】绝对不要以多态方式处理数组
阅读量:5994 次
发布时间:2019-06-20

本文共 706 字,大约阅读时间需要 2 分钟。

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、结论就是:绝对不要以多态方式处理数组。

转载地址:http://itqlx.baihongyu.com/

你可能感兴趣的文章
导出excel(sqlserver)
查看>>
Gallery Server Pro ----用于分享相片,视频,音频及其他媒体的ASP.NET相册[Carol]
查看>>
Uvaoj 11248 Frequency Hopping(Dinic求最小割)
查看>>
网站统计代码
查看>>
安装centos 7的时候出现An Unknown Error Has Occurred
查看>>
Linux常用命令大全
查看>>
ceph存储 磁盘IOPS常识
查看>>
ORA-12720: operation requires database is in EXCLUSIVE mode
查看>>
ELK日志服务使用-kafka传输日志(bbotte.com)
查看>>
linux系统之iptables其二命令注解
查看>>
Silverlight C# 游戏开发:高深莫测却浅显易懂的游戏开发
查看>>
标准ACL+扩展ACL+命名ACL
查看>>
Linux常用的基本命令14
查看>>
《zabbix进程组成结构与zabbix_agentd.conf配置文件参数详解》-3
查看>>
8-22学习练习[一个viewController整合增删移动功能]
查看>>
MySQL的字符集
查看>>
Selenium2+python自动化63-简易项目搭建
查看>>
Managed Debugging Assistant &#39;PInvokeStackImbalance&#39; has detected a problem in 解决方案
查看>>
centos7 安装mysql5.7.11注意事项
查看>>
[20150727]''与NULL.txt
查看>>