什么是多态?
多态是C++三大特性之一,它可以简单的概括为“一个接口,多种方法”,程序在运行时才能通过基类指针指向的对象的类型来决定调用那个函数,今天我们就要谈谈多态的底层的实现。
虚函数
C++多态是通过虚函数来实现的,所谓的虚函数,就是在类的成员函数返回值类型前面加上virtual关键字来定义的,在C++中允许派生类对基类的虚函数进行重写,一旦派生类对基类的虚函数进行重写,那么在派生类中,基类的虚函数将会被覆盖,如果我们想通过派生类的对象来调用基类的虚函数有两种方法,一种是通过访问限定符来调用;另一种方法是动态绑定
动态绑定
多态与非多态的实质性区别就是所调用的函数的地址是静态绑定(早绑定)还是动态绑定(晚绑定),如果函数调用的地址在编译期间就可以被确定,并产生相关代码,那么就是静态绑定;如果函数调用的地址是在运行时决定的,那么就属于动态绑定。
继承与转换
在C++中,封装是为了使代码啊模块化,继承是为了扩展已经存在的代码,两个特性都是为了达到代码重用的目的;而多态则是为了让接口能够被重用,也就是说,不论传递过来的是那个类的对象,函数都能通过同一个接口调用到适应各自对象的方法,实现这个技术最常用的方法就是定义一个基类的指针,利用指针指向任意一个子类的对象,调用相应的虚函数。如下图:
虚函数的重写
* 虚函数重写*:当在子类定义了一个与父类完全相同的虚函数时,则称这个子类的函数重写了父类的虚函数(函数名,参数列表,返回值完全相同协变除外)。
协变:当虚函数返回类型是类本身的指针或引用时,上述规则无效。
例如:
class Bas