当前位置导航:炫浪网>>网络学院>>编程开发>>C++教程>>C++进阶与实例

C++基础:C++中的虚函数的实现方法

    学习 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) //这个地方我是看表项是不是为空来判断是否到了表尾,
    //大多数情况都是对的,不过不能为准
 {
  printf(\"VF:%p , %p\\n\", p , *p);
  p++;
 }
 printf(\"End\\n\\n\");
}


    首先我们看单个类时的虚函数表的情况:

 class C1
{
public:
 C1()
 {
  //printf(\"In/ C1\\n\");
  //DispVFT((DWORD*)this/);
 };
 virtual F1()
 {}
};
void main()
{
 C1 c1;

 //由于C1中没有成员数据,所有我们可以用这种方式判断
 //C1/中的虚函数表指针的个数
 printf(\"vftptr count :%d\\n\" , sizeof(C1) / 4);
 //显示内存结构
 DispVFT((DWORD* )&c1);
}


    输出:

    vftptr count :1

    VFT Pointer:0012FF7C

    Begin

    VF:00420048 , 00401078(C1::F1)

    End

    很单纯,不用多讲,这是我们意料之中的结果。

共5页 首页 上一页 1 2 3 4 5 下一页 尾页 跳转到
相关内容
赞助商链接