在类的成员方法函数前面添加virtual关键字,该函数即被定义为虚函数(简写vf)。
内存会在.rodata区(只读)为这个虚函数开辟一张虚函数表
虚函数表存储一下信息:
- &RTTI:运行时的类型信息
- 偏移量
- 虚函数的地址
覆盖
如果派生类的方法和基类中的某个虚函数方法函数名和参数列表,返回值都一样,派生类的方法直接处理成虚函数,在虚函数表中派生类的虚函数覆盖基类的虚函数的地址,同时派生类定义的对象的内存中也多出一个vfptr。
虚函数与普通函数的区别
1.内存
在定义有虚函数的的类对象中,内存会多一项vfptr(虚函数表指针),该指针指向虚函数表(vftable)的位置。
一个含有虚函数的类定义的多个对象,vfptr指向同一张vftable。
类中的虚函数个数不影响对象的内存,但是影响vftable的大小。
2.静态绑定和动态绑定
对象调用成员方法,如果该方法函数不是虚函数,静态绑定(编译时期完成)
如果是虚函数,动态绑定(寄存器中)首先找到vftable地址,然后在虚函数表中找到虚函数的地址,调用完成。