zoukankan      html  css  js  c++  java
  • 【More Effective C++】Item 3

    Item 3:绝对不要以多态方式处理数组

      当用一个base class 的指针或者引用来处理derived class objects时,我们就认为这样的指针或者引用具有多态性。

      多态性是C++的特性之一,应该是方便程序员的,但是如果使用不当,也会给程序员带来许多苦恼。

      在C++中,允许使用base class的指针或者引用来操作derived class 的对象数组,这样的操作,会给你带来意想不到的麻烦。

      这是为什么呢?

      原因就在于:指针大小的算术运算。

      下面我们举例说明:当我们输出derived class 对象的数组元素时,会用到vd[i]进行操作,但是其实这是一个“指针算术表达式的简写”,完整的应该是*(vd+i);

      那么问题就出现了,这个 i 指的是多大呢?我们都知道数组的间隔大小是数据元素的大小,即 i * sizeof( base class object),因此编译器需要知道计算对象的大小;

      但是,数组原本声明的是base class 类型,当你传送一个derived class 类型的数据过去时,编译器还是按照base class object 的大小进行计算,因此输出的结果未知。

      

      同样的原因,当使用base class 的数组去操作删除derived class 的数组时,也因为指针大小的算术运算而导致失败。

      因此,我们建议:

      (1)数组和多态不要混用;

      (2) 尽量避免“一个具体的类继承自另一个具体的类”。(这样不容易犯数组合多态混用的错误)

  • 相关阅读:
    br_
    -fpic -fPIC -fpie -fPIE
    (OK) cross_compile_readline_for_android-x86_64-6.0
    Installing the GNU Readline library
    How to get libreadline for Android?
    (OK)(OK) seem-tools-init-android-x86_64-6.0-rc1-0.sh
    (OK)(OK) seem-tools-CLI-semi-auto.sh---nic1_2-hostonly-bridged
    (OK)(OK) seem-tools-auto_create_vm_android.sh
    (OK) run my script at boot time in android-x86_64 (Chih-Wei Huang)
    【习题 3-4 UVA
  • 原文地址:https://www.cnblogs.com/next-IT-direction/p/3588799.html
Copyright © 2011-2022 走看看