本文主要是介绍C++笔记:虚表及其汇编,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 前言
前言
查看一下,虚表的调用路径,以便更好地理解虚表
先查看代码
#include <iostream>
using namespace std;
struct Animal {int m_age;virtual void speak() {cout << "Animal::speak()" << endl;}virtual void run() {cout << "Animal::run()" << endl;}
};struct Cat:Animal {int m_life;void speak() {cout << "Cat::speak()" << endl;}void run() {cout << "Cat::run()" << endl;}
};int main()
{Animal* cat = new Cat();cat->m_age = 10;cat->speak();cat->run();//getchar();return 0;
}
查看局部变量可以发现
cat对象地址为:
打开内存,查看地址0x008f9210的内容,发现:
其中,因为小端模式,因为父类继承的时候父类成员变量的地址在前、子类成员变量的地址在后
00819c74为虚表地址
0000000a是m_age
0000000a是m_life
接着,查看虚表地址00819c74的内容
再看这两个地址分别是什么?
利用反汇编功能
跳入call eax,也即调用寄存器eax里面存储的地址,
发现
也就是
0081150F应该是Cat::speak的调用地址
008115EC应该是Cat::run的调用地址
这篇关于C++笔记:虚表及其汇编的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!