虚函数地址问题的vcall引入
class MYACLS { public: virtual void myvirfunc1() { } virtual void myvirfunc2() { } }; int main() { printf("MYACLS::myvirfunc1()地址=%p\n", &MYACLS::myvirfunc1); //打印的是vcall函数(代码)地址,而不是真正的虚函数; printf("MYACLS::myvirfunc2()地址=%p\n", &MYACLS::myvirfunc2); cout << sizeof(MYACLS) << endl; MYACLS *pmyobj = new MYACLS(); return 1; }
- 调试,查看对象中的虚函数地址:
- 输出虚函数地址:
- 调试查看虚函数表中的虚函数地址
- 通过反汇编探究原因(vacall进行了中转)
- 【补充】vcall thunk的作用
- 调整this指针
- 跳转到真正的虚函数中