C++的多态

三次面试都遇到了这个问题
我想必须把这个问题搞得引经据典的清楚才不愧对这三次被拒的offer
让下一家再敢问这个问题的面试官,也能一下梳理出几种多态,提问者竟然学到了知识,他肯定好感大增

简单讲,一个接口,多个方法。封装是代码重用,多态是接口重用。
C++的多态性是通过虚函数来实现的

子类重新定义父类的方法称为覆盖
允许有多个同名的函数,这些函数的参数列表不同成为重载,但这并没有体现多态特性

多态非多态的区别就是早绑定还是晚绑定,
编译期间确定函数的是静态编译,早绑定。
运行时才能确定的是动态编译,晚绑定,才是多态。

(动态多态就是通过继承+虚函数才能实现)

只有重写了虚函数才算体现了多态性

虚函数

虚函数的定义是:在基类中进行的,基类中需要定义为虚函数的成员函数的声明冠以关键字 virtual。
此虚函数就可以在一个或多个派生类中被重新定义。但是接口类型、参数个数等都必须与基类一致!

是重载的另一种表现形似,是一种动态重载的方式。提供更灵活的运行时的多态机制。动态链接。(只有通过使用基类指针访问虚函数时才能获得运行时的多态性。)

纯虚函数

抽象类不能实例化对象,只能被继承。

重载,重写(覆盖),以及重定义

C++的多态
重载overload: 同一作用域,参数列表不同(静态多态),早绑定
【编译器通过参数列表的不同内部给函数重新命名成一些预处理函数,分别调用,这并不是多态】
重写override(覆盖): 不同作用域,子类继承了基类的函数。基类必须有virtual关键字。参数必须相同
重写的函数是虚函数,因而体现了动态多态,晚绑定
重定义redefine(隐藏): 不同作用域。
参数不同时,基类被隐藏;参数相同但是基类无virtual时,基类被隐藏。

https://blog.****.net/skySongkran/article/details/82012698