学习 C++ 的同志不知道有没有和我一样遇到过这样的困惑:C++中的虚函数到底怎么实现的?在各种继承关系中,虚函数表的结构到底是什么样的?曾经我是很想当然,可是后来在使用ATL的过程中,我发现并不是我想的那样。大家知道,利用C++语言本身的特性进行COM编程当然是很方便的事,但是你就得随时随地都知道那虚函数表里头到底是些什么东西。讲C++语法的书没有义务告诉你C++产生的虚函数表是什么样的,这就是头痛的所在。
自已做试验是件很快乐的事,我很愿意这么做。
首先写个函数,作为我们实验的基础。传入虚函数表指针,显示虚数表的内容。
void DispVFT(DWORD* pVFT)
{
printf("VFT Pointer:%p\n" , pVFT);
printf("Begin\n");
DWORD* p = (DWORD* )*pVFT;//得到VFT的首址
while(*p) file://这个地方我是看表项是不是为空来判断是否到了表尾,
file://大多数情况都是对的,不过不能为准
{
printf("VF:%p , %p\n", p , *p);
p++;
}
printf("End\n\n");
}
首先我们看单个类时的虚函数表的情况:
class C1
{
public:
C1()
{
file://printf(%22in/ C1\n");
file://dispvft((dword*)this/);
};
virtual F1()
{}
};
void main()
{
C1 c1;
file://由于C1中没有成员数据,所有我们可以用这种方式判断
file://c1/中的虚函数表指针的个数
printf("vftptr count :%d\n" , sizeof(C1) / 4);
file://显示内存结构
DispVFT((DWORD* )&c1);
}
输出:
vftptr count :1
VFT Pointer:0012FF7C
Begin
VF:00420048 , 00401078(C1::F1)
End