C++ 为什么要使用继承?为什么要使用动态绑定?为什么要使用虚函数?

继承和动态绑定对程序的编写有两方面的影响:
  使用继承,我们可以更容易地定义与其他类相似但不完全相同的新类;
  使用动态绑定,可以在一定程度上忽略相似类型的区别,而以统一的方式使用它们的对象。


  通过使用动态绑定,我们能用同一段代码分别处理基类和派生类们的对象。在C++语言中,当我们使用基类的引用(或指针)调用一个虚函数时将发生动态绑定。动态绑定,又称运行时的绑定,顾名思义,即在程序运行时选择调用哪个版本(对象)的虚函数。

  有虚函数,程序就可以在运行阶段做决定到底选择哪个版本的虚函数;没有虚函数,程序就会在编译阶段静态绑定(不做选择)。那个为什么要大费周章地使用动态绑定、使用虚函数呢?这样是为了能使用同一段代码(一个函数,函数的形参有基类的引用或指针),用来处理很多的类(基类和其派生类们)的对象。

  设想一下,如果没有虚函数,每个基类的派生类都定义自己独立的net_price(返回书籍的实际销售价格的成员函数),那么就不可能设计同一段代码(同一个函数)来调用所有的类的对象的net_price(类外函数的形参是设成基类的引用(或指针)呢?还是哪个派生类的引用(或指针)呢?)

  所以通过继承和动态绑定(使用虚函数)这两大法宝,可以实现以统一的方式,自如地调用各种类的对象,使我们能够编写具有特定类型行为但又独立于类型的程序。这种统一的美学,是必须要追求的。

  注:在C++中,动态绑定只作用于虚函数,并且需要通过指针或引用调用。


我们能将基类的指针或引用绑定到派生类对象中的基类部分上。

  Quote item;      //基类对象
  Bulk_Quote bulk;  //派生类对象
  Quote p = &item;  //p指向基类对象
  p = &bulk;      //p指向派生类中的
基类部分(派生类的对象的地址,可以赋值给指向基类的指针)
  Quote &r = bulk;  //定义一个基类对象的引用r,绑定到派生类中的
基类部分*(用派生类的对象,可以初始化基类的引用)

这种转换通常称为派生类到基类的类型转换。换种说法,我们可以把派生类的对象当基类的对象来使用。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 前言 把《C++ Primer》[https://book.douban.com/subject/25708312...
    尤汐Yogy阅读 9,554评论 1 51
  • 3. 类设计者工具 3.1 拷贝控制 五种函数拷贝构造函数拷贝赋值运算符移动构造函数移动赋值运算符析构函数拷贝和移...
    王侦阅读 1,927评论 0 1
  • C++虚函数 C++虚函数是多态性实现的重要方式,当某个虚函数通过指针或者引用调用时,编译器产生的代码直到运行时才...
    小白将阅读 1,762评论 4 19
  • 我们知道,在同一类中是不能定义两个名字相同、参数个数和类型都相同的函数的,否则就是“重复定义”。但是在类的继承层次...
    踩在浪花上00阅读 472评论 0 1
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,174评论 1 32