首页 > 编程语言 > 详细

C++逆向分析----虚函数与多层继承

时间:2020-11-26 22:29:22      阅读:38      评论:0      收藏:0      [点我收藏+]

虚函数

C++通过关键字virtual来将函数声明为一个虚函数。当一个类包含虚函数后编译器就会给类的实例对象增加一个虚表指针,所谓的虚表指针就是指向虚表的指针。虚表就是一张地址表,它包含了这个类中所有虚函数的地址。对象所在内存的前四个字节就是虚表指针。

class Test
{
public:
	int iNum = 1;
	virtual void Proc1();
	virtual void Proc2();
	virtual void Proc3();
};

Test test();

例如以上示例中,如果实例化一个Test对象,在内存中查看对象内存地址。因为前四个字节存储的是虚表指针,我们查看对应的虚表地址发现对应的三个虚拟函数的地址。
技术分享图片

技术分享图片
对象在刚实例化时虚表指针中的值是无意义的,当对象调用构造函数时,构造函数会对虚表指针进行初始化为当前类的虚表地址。

技术分享图片

所以当我们没有为类提供默认的构造函数时,为了能够初始化虚表指针编译器会为类提供一个默认的构造函数,从而在构造函数中对虚表指针进行初始化。

虚函数的直接调用

test.Proc1();

当我们没有使用对象指针或者对象引用类调用虚函数时,例如通过类对象调用虚函数时,编译器并不会去查虚表,而是直接调用对应类的虚函数。(因为查表是无意义的,此时其虚表中的函数地址一定是等于实际的虚函数地址的)
技术分享图片

虚函数的间接调用

Test* test;
test->Proc1();
test->Proc3();
test->Proc2();

当我们利用指针或者是引用来调用虚函数时,编译器就会通过虚表指针查询虚表来调用虚表中对应的虚函数的地址,继而形成多态。
技术分享图片

多层继承中的虚函数

C++逆向分析----虚函数与多层继承

原文:https://www.cnblogs.com/revercc/p/14044734.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!