一、虚函数重要性
虚函数是面向对象的重要组成部分,是多态的基础,如果定义了虚函数但是没有定义构造函数,编译器必须提供默认的构造函数(因为必须要初始化虚表指针);
二、虚函数特性与识别
虚表指针一定是在对象的首地址的前4个字节(固定的,且4字节,这一点很重要),虚表指针指向的虚函数表的首地址,虚函数作为成员函数使用; 对于开发者来说,虚表和虚表指针都是隐藏的;
如果类没有虚函数,构造的时候不会进行初始化虚表指针的操作;
2.1 虚表的获取: 都是先得到this 指针,然后得到虚表指针,成员函数调用需要传递this指针到ecx,最后间接调用。
具体汇编代码如下:
mov ecx, dword ptr[ebp - 14h] ; ecx 得到this指针
mov edx, dword ptr [ecx] ; 得到虚表地址,this指针指向的第一个4字节就是虚表地址; edx 就是虚表地址;
mov esi,esp
mov ecx, dword ptr [ebp -14h] ;成员函数调用,需要ecx保存this指针;
call dword ptr [edx + 4] ;间接调用 虚函数