多态分为两类
-
静态多态: 函数重载 和 运算符重载属于静态多态,复用函数名
-
动态多态: 派生类和虚函数实现运行时多态
静态多态和动态多态区别:
-
静态多态的函数地址早绑定 - 编译阶段确定函数地址,使用函数的时候是根据其编译类型确定的如何执行
-
动态多态的函数地址晚绑定 - 运行阶段确定函数地址,使用函数的时候是根据其运行类型确定的如何执行(虚函数)
-
//虚函数的地址不会在编译的时候确定,而是在运行的时候根据运行类型来动态确定,这样就能实现动态绑定,就是根据调用者的运行类型来确定具体是那个类型的方法
具体分析:
虚函数的具体实现原理:
子类重写了父类的虚函数之后,会覆盖掉vftable中父类的虚函数
运行的时候会通过vfptr找到vftable中的函数,就是具体调用的哪个函数。
如此,就能够实现运行时,通过运行类型来确定是那个作用域下的函数,实现了动态绑定。