多态分为静态多态和动态多态
静态多态(静态绑定、静态联编、早绑定):在编译期间,就可以确定函数的行为,即:具体调用哪个函数
具体体现:函数重载和模板
函数重载:在编译期间,编译器会对函数实参类型进行推演,然后根据推演的结果选择合适的函数进行调用,如果有完全匹配的,直接调用;否则进行隐式类型转化,如果可以转化则调用,否则报错
模板:在编译期间,编译器会对函数实参类型进行推演,然后根据推演的结果再给模板的参数设定为具体的类型,然后再进行实现
动态多态(动态绑定、动态联编、晚绑定):在程序运行时,根据基类指针或者引用指向不同类的对象,调用对应的虚函数(在程序运行时,确定函数具体的行为)
必须通过基类的指针或者引用调用虚函数
被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写
虚函数重写:派生类中有一个跟基类完全相同的虚函数(即派生类虚函数与基类虚函数的返回值类型、函数名、参数列表完全相同)。
重载:
两个函数在同一个作用域
函数名/参数相同
重写:
两个函数分别在基类和派生类的作用域
函数名/参数/返回值都必须相同(协变例外)
两个函数必须是虚函数
重定义:
两个函数分别在基类和派生类的作用域
函数名相同
两个基类和派生类的同名函数不构成重写就是重定义