zoukankan      html  css  js  c++  java
  • 【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、结论就是:绝对不要以多态方式处理数组。

  • 相关阅读:
    ProGuard代码混淆
    电影资源网站分享
    mvn高级构建
    BeanUtils对象属性copy的性能对比以及源码分析
    你可能用到的Spring工具类?
    搭建K8s集群
    IDEA部署Spring-boot到Docker容器
    搭建团队协作办公wiki (confluence)
    Linux中关闭SSH的DNS解析
    责任链异步处理设计模型
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3577011.html
Copyright © 2011-2022 走看看