1.什么是多态
通俗的说,多态就是多种形态,具体点说就是去完成某个行为,当不同的对象去完成时会产生不同的状态。
实现多态的条件:
1.调用函数的对象必须是指针或引用
2.被调用的函数必须是虚函数,且完成了虚函数的重写。
什么是虚函数?
虚函数就是在类的成员函数前面加virtual关键字
什么是虚函数重写?
虚函数重写:派生类中有一个跟基类完全相同的虚函数,我们就称子类的虚函数重写了基类的虚函数。虚函数的重写也叫作虚函数的覆盖。
完全相同是指:函数名、参数、返回值都相同。
虚函数重写有一个例外:协变
重写的虚函数的返回值可以不同,但是必须分别是基类指针和派生类指针或基类引用和派生类引用。
析构函数的重写问题:
基类中析构函数如果是虚函数,那么派生类的析构函数就重写了基类的析构函数,这里他们的函数名不相同,看起来违背了重写的规则,其实不然。这里我们可以理解为编译器对析构函数的名称做了特殊处理,编译后析构函数的名字统一处理成destructor,这也说明基类的析构函数最好写成虚函数。
多态的实现原理?
虚函数表
inline函数可以是虚函数吗
不能,因为inline函数没有地址,无法把地址放到虚函数表中。
静态成员可以是虚函数表吗?
不能,因为静态成员函数没有this指针,使用类型::成员函数的调用方法无法访问虚函数表,所以静态函数无法放进虚函数表。
构造函数可以是虚函数吗?
不能,因为对象中虚函数表指针是在构造函数初始化列表阶段才初始化的。
对象访问普通函数快还是虚函数快?
如果是普通对象,是一样快的。如果是指针对象或者是引用对象,则调用普通函数快,因为构成多态,运行时调用虚函数需到虚函数表中去查找,耗费时间。
虚函数表是在什么阶段生成的,存在哪里。
虚函数表是在编译阶段生成的,一般情况下存在静态区。
什么是静态绑定与动态绑定?
**静态绑定:**又称为前期绑定,在程序编译期间就确定了程序的行为,也称为静态多态,比如函数重载。
动态绑定:又称为后期绑定,是在程序运行期间,具体拿到的类型确定程序的具体行为,调用具体的函数,也称为动态多态,比如重写。