谈到虚函数,我想很多朋友都应该知道虚函数表指针VPTR和虚函数表VTABLE,如果不清楚的朋友,建议先看看侯捷先生翻译的《深度探索C++对象模型》:)
刚开始的时候,我仅仅知道虚函数的多态机制是通过VPTR和VTABLE操控的,完全地相信书上所描述的,并没有亲自去证明过,或许是因为那时候我还没有接触到逆向分析吧:)
提几个问题:
1. VPTR的大小如何确定?
2. VPTR在类实例中的偏移值是多少?
3. VPTR是如何索引到需要调用的函数的?
4. VTABLE中函数的顺序是如何确定的?
了解上述问题的朋友,可以关闭这个窗口了:)
考虑如下代码:
#include <cstdio>
class Base
{
public:
int i;
char c;
double d;
Base()
{
i = 4;
c = 'A';
d = 2.0;
}
virtual void Virtual_Func_A()
{
printf("Virtual_Func_A()\n");
}
virtual void Virtual_Func_B()
{
printf("Virtual_Func_B()\n");
}
};
int main(void)
{
Base* b = new Base;
b->Virtual_Func_A();
b->Virtual_Func_A();
return 0;
}
分析工具:VC 6.0
分析过程:
在解答这个问题前,读者有必要了解一下“数据对齐”的概念,如果不了解的读者,可以参考下:)