c++虚函数
为了实现由一个基类派生出的多个子类,对于其中的某个功能,各个子类实现不同的操作,需要用到虚函数。
如果将基类中的一个成员函数声明为虚函数(virtual),子类中的同名函数也成为虚函数,并且对基类版本形成覆盖。隐藏只需要是同名的标识符即可构成隐藏,而覆盖的条件非常严格。函数名、形参表、const必须一致,返回值也要一致(基本类型)或相符(类类型的指针或引用)。
编译器遇到通过指向子类对象的基类指针调用基类中的虚函数时,与普通函数的处理不同,不会立刻生成调用代码,而会生成若干条指令,待程序运行时被执行。
运行时执行如下动作:
1. 根据基类指针指向的对象类型,找到目标对象中的虚函数表的指针(**);
2. 通过虚函数表指针(**),找到虚函数的地址(*);
3. 根据虚函数地址,执行虚函数代码。
这种通过基类指针或引用最终调用子类是虚函数的现象,称为多态。
如果子类中不存在覆盖版本,则执行基类中的虚函数。