前几天面试被问到了这个,当时没有回答上来,可能还是没有理解,(之前也看过相关的文章,但写的都过于复杂),今天新自调试了一次,把结果拿出来分享一下
1、虚函数表是什么东西,是如何存在的?是什么时候创建的?
虚函数表实际上就是一个函数指针数组,如果我们定义了n虚函数,那个这个数组个数就是n。
这个指针属于顶级父类,所以多继承,继承了几个父类,就有几个虚函数表
从我调试分析,虚函数表的地址是固定的,也就是说这个东西不是实例创建的时候才生成的,而是程序一运行起来就有的,也就是编译时期确定好的
2、虚函数表是依据什么生成,编译期会生成几个虚函数表?
虚函数表虽然是顶级父类的成员,但它却是跟叶子类绑定的,也就是说有多少个叶子类,编译器就会准备多少个虚函数表。子类的每个虚函数,会沿着父类到子类这条路下来,如果有重写就会将指针替换子类的
3、虚函数表是如何实现多态的?
当调用虚函数的时候,会直接从虚函数表里找对应的函数,而不再根据此指针或引用的类型找对应类的成员函数