1.什么是多态
多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成时会产生出不同的状态。
2.构成多态的条件
多态在Java中指对于不同继承关系的类对象,去调用同一函数,产生了不同的行为。
由此可知构成多态需要:
1、必须通过基类的指针或者引用调用函数
2、被调用的函数必须是虚函数,且子类必须对父类的虚函数进行重写
什么是虚函数:
被virtual修饰的类成员函数;子类虚函数和父类虚函数的返回类型、函数名字、参数列表完全相同;
虚函数重写(覆盖)
子类中有一个跟父类完全相同的虚函数,称子类的虚函数重写了父类的虚函数
3.抽象类/接口类
1、概念
在虚函数后加上=0,则称这个函数为纯虚函数。包括纯虚函数的类叫抽象类(接口类),接口类不能实例化出对象,其子类继承后也不能实例化出对象,除非重写纯虚函数。
纯虚函数体现出了接口继承。
2.接口继承和实现继承
虚函数的继承是一种接口继承,子类继承的是父类虚函数的接口,目的是为了重写,达成多态,继承的是接口。若不实现多态不需将函数定义为虚函数。
4.多态的原理
1.虚函数表
除了原有成员,还会产生一个指针对象,称为虚函数表指针(_vfptr)
一个含有虚函数的类中至少都有一个虚函数表指针,因为虚函数的地址要被放到虚函数表中,虚函数表也称虚表。
2.虚函数存在在哪里?虚表存在在哪里?
虚表存的是虚函数指针,不是虚函数;虚函数和普通函数一样,都存在在代码段,只是与此同时他的指针又存在于虚表内。此外,对象中存的不是虚表,是虚表指针。
3.多态的原理
由于虚表中,虚函数指针指向不同,在调用同一函数时会指向不同地址,因而结果不同
4.动态绑定与静态绑定
1.静态绑定又称前期绑定(早绑定/静态多态),在程序编译期间确定了程序的行为,如:函数重载
2.动态绑定又称后期绑定(晚绑定/动态多态),在程序运行期间根据具体拿到的类型确定程序的具体行为;