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的调用地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值