美文网首页
[C++进阶]绝对不要以多态的方式处理数组

[C++进阶]绝对不要以多态的方式处理数组

作者: 小鱼号的代码日记 | 来源:发表于2020-04-22 00:02 被阅读0次

继承(inheritance)的最重要的性质之一就是:你可以通过“指向 base class objects”的pointer 或references 来操作derived class objects,如此的pointers 和references我们说其行为是多态的。

C++语言规范中说,通过base class 指针删除一个由derived classes objects构成的数组,其结果未定义。

总结:

多态(polymorphism)和指针算术不能混用,数组对象几乎总是会涉及指针的算术运算,所以数组和多态不要混用。

/***************************
 more effectivre c++
 35个改善编程与设计的有效方法
 条款3:绝对不要以多态的方式处理数组
 ---------小鱼号的代码日记--------------
****************************/

/*********************************
继承(inheritance)的最重要的性质之一就是:
你可以通过“指向 base class objects”的pointer 或references
来操作derived class objects,
如此的pointers 和references我们说其行为是多态的。
**********************************/
#include<iostream>
using namespace std;

class BST{
public:
    BST():
        m_num(0){}

    BST(int num):
        m_num(num){}


    friend ostream &operator<<( ostream &output,
                                          const BST &bst )
         {
            output << "BST num : " << bst.m_num << endl;
            return output;
         }
private:
    int m_num;
};
class BalancedBST:public BST
{
private:
    int m_bNum;
};

void printBSTArray(ostream &s, const BST array[],int numElements)
{
 for(int i = 0; i < numElements; i++)
 {
    s << array[i];
 }
}
/*********************************
array[i] 其实是“一个指针算术表达式”的简写
代表 *(array + i)
array指向数组的起始处
array 和array + i 在内容中相差 i * sizeof(数组中的对象)
****************************/

void deleteArray(ostream &logStream,BST array[])
{
  logStream <<" Deleting array at address "
            << static_cast<void*>(array) << "\n";
  delete [] array;
}
int main()
{
   BST BSTArray[10];
   printBSTArray(cout,BSTArray,10);  //运行良好

   BalancedBST  bBSTArray[10];
   printBSTArray(cout,bBSTArray,10);  //正常运行??
   /*******************************
    由于sizeof(bBSTArray)通常比sizeof(BST)大
    所以便会出现不可预期的结果
    *****************************/
   deleteArray(cout,BSTArray);
   ///deleteArray(cout,bBSTArray);//正常运行??
   return 0;
}
/*****************************************
C++语言规范中说,通过base class 指针删除一个
由derived classes objects构成的数组,其结果未定义。

多态(polymorphism)和指针算术不能混用,
数组对象几乎总是会涉及指针的算术运算,
所以数组和多态不要混用。
*********************************/

内容选自:
more effectivre c++
35个改善编程与设计的有效方法

相关文章

  • [C++进阶]绝对不要以多态的方式处理数组

    继承(inheritance)的最重要的性质之一就是:你可以通过“指向 base class objects”的p...

  • C++声明数组

    C++学习 C++中创建数组的方式有三种方式

  • C++编译期多态和运行期多态

    C++多态有多种实现方式,在面对对象编程时,采用的是运行期多态,也称动态多态。在泛型编程中,多态基于模板的具现化与...

  • 深刻剖析之c++博客文章

    三大特性 封装、继承、多态 多态 C++ 虚函数表解析C++多态的实现原理 介绍了类的多态(虚函数和动态/迟绑定)...

  • C++ 虚函数 总结

    虚函数是 C++ 实现多态的方式。 什么是多态?多态性常被视为自封装和继承之后,面向对象的编程的第三个支柱。如果举...

  • c++常用的STL

    c++ 中常用的内置函数 标签: c++ 1. algorithm中处理数组/vect的函数 1.可以处理两种数据...

  • 面向对象之多态

    多态 多态可以使我们以相同的方式处理不同类型的对象。我们可以使用一段代码处理不同类型的对象,只要他们继承/...

  • C++基本概念复习_2018-06-25

    C++基础 (1)C和C++的区别 C++分为: C部分(区块、语句、预处理器、内置数据类型、数组、指针等); 面...

  • 多态的C++实现

    多态的C++实现 1 多态的原理 什么是多态?多态是面向对象的特性之一,只用父类指针指向子类的对象。 1.1 多态...

  • C++ 的多态(Polymorphism), virtual f

    多态 c++支持两种多态,编译时多态和运行时多态但其实编译时多态根本不是真正的多态,编译时多态就是函数的重载,ov...

网友评论

      本文标题:[C++进阶]绝对不要以多态的方式处理数组

      本文链接:https://www.haomeiwen.com/subject/lfyvihtx.html