继承是实现多态的基础。虚函数是实现多态的方法。虚函数、多态、继承都是紧密相关的概念。而继承是所有概念的基础;
多态:简单来讲就是接口一样,实现多样。多态是指通过基类的指针或者引用,在运行时动态调用实际绑定对象函数的行为。与之相对应的编译时绑定函数称为静态绑定。多态是面向对象编程的核心思想之一。多态还有个关键之处就是一切用指向基类的指针或引用来操作对象。
虚函数:刚才说到,指向基类的指针在操作它的多态类对象时,会根据不同类的对象,调用其相应的函数。这个函数就是虚函数。虚函数的虚是在于它的调用不是在编译时被确定的,而是在运行时被确定的。
虚函数就是在函数名声明前面加一个关键字 virtual。
这里顺便阐述一个概念:联编
将源代码中的函数调用解释为特定的函数代码块被称为函数名联编(binding)。就像上方所说的“绑定”,是一回事。
编译器可以在编译过程中完成联编,这被称作静态联编。又称为早期联编。
虚函数使这项工作变得更加困难。使用哪个函数不是在编译时就能确定的,因为编译器不知道用户将选择哪个类型的对象。所以编译器必须生成能够在程序运行时选择正确的虚方法的代码,这被称为动态联编,又称为晚期联编。
编译器对非虚方法使用静态联编。对虚方法采用动态联编。
因此我们可以理解虚函数的意义在于告诉编译器采用动态联编的方式。之所以这样做的目的还是为了服务于多态的要求。
虚函数的作用,用专业术语来解释就是实现多态性(Polymorphism)。
C++的指导原则之一就是不要为不使用的特性付出代价(内存或处理时间)。
而虚函数的技术,是会造成额外的开销,为了使程序能够在运行阶段进行决策,必须采用一些方法跟踪基类指针或引用指向的对象类型,这增加了额外的的处理开销。
使用静态联编的方式就更加高效,所以默认都是使用静态联编的方式。
纯虚函数:
为了方便实现多态特性,常常需要在基类中定义虚拟函数,但是往往基类是一种抽象类,其本身是不能被实例化的。
所以为了解决上述问题,引入纯虚函数的概念。
纯虚函数在基类中声明,但没有定义。
但要求任何派生类都要定义自己的实现方法。
使用方式就是:在基类函数原型后面加"=0"
====================================================
相关阅读:
如果期望派生类重新定义一个成员函数,应该在基类中把此函数设为virtual。
允许在派生类中重新定义与基类同名的函数,并且可以通过基类指针或引用来访问基类和派生类中的同名函数。
在基类用virtual声明成员函数为虚函数可以在派生类中重新定义此函数,为它赋予新的功能,并能方便地被调用。
如果在派生类中没有对基类的虚函数重新定义,则派生类简单地继承其直接基类的虚函数。
如果在派生类中重新定义此函数,要求函数名、函数类型、函数参数个数和类型全部与基类的虚函数相同,并根据派生类的需要重新定义函数体。
在派生类重新声明该虚函数时,可以加virtual,也可以不加,但习惯上一般在每一层声明该函数时都加virtual,使程序更加清晰。
纯虚函数
抽象类中的虚函数不打算被调用,不应该定义它,应该把它设置为纯虚函数(在函数声明之后加上'=0'即可);
基类不在基类中实现纯虚函数的方法是在函数原型后加“=0”
virtual void funtion1()=0
纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。
拥有纯虚函数者为抽象类,以别于所谓的具体类;
抽象类不能产出对象实例,但是我们可以拥有指向抽象类的指针,以便于操作抽象类中的各个派生类。
为了方便使用多态特性,我们常常需要在基类中定义虚拟函数。
在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。
为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。
同时含有纯虚拟函数的类称为抽象类,它不能生成对象。
更深层次的讨论:
纯虚函数是为你的程序制定一种标准,即只要你继承了我,就必须按照我和标准来,实现我所有的方法,否则你也是虚拟的,和JAVA里的接口一样,都是制定标准,为了使程序更加通用化,可重用性提高,让所有实现它或继承自它的子类全部按同一标准来工作,你想想大家都按标准来对程序的益处是什么?
===================================================
相关文章传送门:
C++_了解虚函数的概念:https://www.cnblogs.com/grooovvve/p/10112085.html
C++_类继承3-动态联编和静态联编:https://www.cnblogs.com/grooovvve/p/10422296.html
=====================================================
相关链接:
多态的实现原理:https://blog.csdn.net/kwanson/article/details/80379360
多态(C++):https://blog.csdn.net/ijn842/article/details/80936236