C++:子类在重写虚函数时,堆栈中虚表,重写函数存储的情况
2020-05-30 本文已影响0人
dissolvache
···
#include <stdlib.h>
#include <windows.h>
#include <stdio.h>
class A
{
public:
int x;
virtual void test()
{
printf("aaaa /n");
}
};
class B : public A
{
public:
int b;
void test()
{
printf("bbbb/n");
}
};
void Test(A& a)
{
a.test();
}
int main(int argc, char* argv[])
{
B b;
Test(b);
return 0;
}
···
存入虚表 虚表地址存储情况lea eax,[ebp-och] 将对象b的首地址放入eax,push eax 将eax(b的首地址即b函数的虚表地址)放入ebp+8的位置。
函数情况 函数堆栈情况进入函数压栈等操作后,ebp+8为b虚表地址,从虚表找到b的重写函数的地址放入edx,call调用【edx】