定义一个函数为虚函数,不代表这个函数时不被实现(实例化)的函数;定义它为虚函数,是为了允许用指向基类的指针来调用子类的这个函数(重定义的虚函数),定义一个函数为純虚函数才代表函没有被实现(实例化)。
c++运行时的多态性是通过虚函数实现的,虚函数虚在“推迟联编”或者“动态联编”,虚函数并不是在编译的时刻被确定的,而是在运行时刻被确定的。由于编写代码的时候并不能确定被调用的是基类还是某一个派生类的函数,所以被称为虚函数。可以通俗地理解为虚函数可以给我们提供多项选择而不是单选。虚函数通过指针或引用来实现多态的效果
純虚函数
在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法(重定义)。
純虚函数引入的原因(主要从“虚”和“纯”两个角度分析):
1.方便使用多态性,我们常常在基类中定义虚函数
2.在很多时候,基类本身实例化是没有意义的。车类作为基类时,可以派生出私家车类、货车类、巴士类、三轮车类、火车类、摩托车类、电动车类、自行车类等等。车类这个概念太广太抽象,很难与具体的事物联系起来,实例化不合常理,而子类相对来说是具体的,私家车用来载人,货车用来载物,各自有各自的功能,容易和现实联系起来。如果你实例了一个车类,车可以载人也可以载货物,也可以用来骑,那这车就过于复杂了,这样类就失去了意义。简单来说,类是为了化繁为简。
为了解决1和2两个问题,引入了純虚函数的概念,将函数定义为純虚函数,则编译器会要求在派生类中必须重写以实现多态性。含有純虚函数的类是一个抽象类,抽象类不能实例化。在基类中声明純虚函数就是为了告诉子类,我没有具体的内容,你必须提供純虚函数的实现,重写函数以实现自己想要的功能。
想要了解抽象类,点击抽象类
网友评论