文章目录
前言
查看一下,虚表的调用路径,以便更好地理解虚表
先查看代码
#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的调用地址