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】

上一篇下一篇

猜你喜欢

热点阅读