动态多态——虚函数、虚函数表、虚函数指针
作者:互联网
面向对象语言C++三大特性之一——多态,分为静态多态和动态多态。
静态多态指重载,在编译期间就已经绑定,确定调用的函数。
动态多态就是编译时不确定将要调用的函数,因为虚函数的存在,子类重写父类的虚函数,只有运行时才能确定。
正因为有虚函数的存在,才能实现动态多态。
虚函数表就是存放虚函数地址的一个指针数组,虚函数指针就是指向虚函数表的一个指针。
同一个类的不同实例共用同一份虚函数表,他们都通过一个虚表指针指向该虚函数表。虚函数表是在编译期间创建好的,只存在一份。实例化类对象时,编译器自动将类对象的虚表指针指向虚函数表。
虚表指针是在调用构造函数时获得值的,所以构造函数一定不能是虚函数。(因为调用虚函数需要虚表指针获得地址,若构造函数是虚函数,此时虚表指针还没有赋值,无法调用)
子类继承父类,也会同时将父类的虚函数表继承,若子类重写虚函数,则虚函数表中该虚函数指向的地址会被替换为子类重写的虚函数地址。若子类定义自己的虚函数,则在原始的虚函数表中后面会添加指向该虚函数的地址。
建议详细阅读下面的参考内容,通俗易懂,相信你会有收获。
参考:https://blog.twofei.com/496/
标签:调用,虚表,函数,子类,多态,函数指针,指针 来源: https://blog.csdn.net/ldm_666/article/details/118055780