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

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


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

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

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

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

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


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

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

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

————————— 本文结束 感谢您的阅读 —————————
谢谢你请我喝咖啡ლↂ‿‿ↂლ(支付宝扫一扫即可领红包, 消费时可抵现! 你省钱, 我赚钱, 多谢支持~)