C++:子类在重写虚函数时,堆栈中虚表,重写函数存储的情况

···

#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】

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。