C++中多态详解
多态的类型与两个条件
一.多态的类型
多态分为两种类型分别是静态多态和动态多态
-
静态多态,又称前期绑定,其实就是我们认识的函数重载,例如我们最熟悉的cin>>和cout<<本质上就是函数重载如下图:
当我们输入和输不同类型的变量时其实就是一种函数重载。静态的重载是指在编译的时候完成的。因为C++中存在函数名命名规则,通过它就可以实现重载。 -
动态多态,又称后期绑定,是在运行期间调用函数,动态多态和静态多态看似只差一个字,但是本质却千差万别。动态多态是基于继承实现的,而且动态多态有两个实现条件分别为:
必须通过基类的指针或者引用去调用虚函数
被调用的函数必须是虚函数并且派生类中必须对基类的虚函数完成重写
具体如下:
这里我们定义了一个Person基类和它的两个派生类,之后我们可以看到在Person类中,我们定义了一个虚函数,这里就用到了virtual,一定要注意,这里的virtual关键字和之前的虚继承中的virtual关键字虽然是一样的,但是他们两个之间是一点关系都没有的,这里一定要分辨清楚。之后看Student类和Soldier类都对其父类中的虚函数进行了重写,这里的重写所需的条件是子类和父类中的虚函数包括函数名,参数,返回值都要相同,这样才能完成重写,但是这只是大部分,之后会提到一些例外,不需要满足这三个条件也可以实现重写。那么我们如何使用这个多态呢?上面我们提到过,必须通过基类的引用或指针来调用虚函数,如下图:
我们在这里先定义了三个不同的类的对象,之后同时调用f函数,这里要注意这个f函数中的参数类型,是父类的引用类型,所以当调用函数进行参数传参的时候就相当于把你的对象赋值给父类的引用,这样也就完成了第一个条件,当然这里用指针也是可以的如下:
这样我们就可以通过父类的指针或者引用来调用虚函数,这里父类的引用或指针指向哪个对象,调用的就是哪个对象的虚函数,比如上面我们依次调用了Person,Student,Soldier对象,那么就会依次得到结果: