首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > Visual C++ > 找到虚指针的位置
【标  题】:找到虚指针的位置
【关键字】:指针
【来  源】:网络

找到虚指针的位置

    编译器会把一种叫虚指针(vptr)的隐藏数据插入到至少拥有一个虚函数的类中。 vptr 是一种指向虚函数地址列表的指针。在不同编译器中, vptr 所在位置是不同的。


一些编译器(例如:Visual C++ 和 C++ Builder)把 vptr 放置在类的开头部分,在所有用户声明的数据成员的前面。而另一些编译器,像GCC 和 DEC CXX,把 vptr 放在类的结尾部分,在所有用户声明的数据成员的后面。

通常,你不用关心 vptr 位置所在。尽管如此,在某些条件下,在使对象序列化的程序中,vptr 的位置所在还是有些不同影响的。

如何找到vptr 了?首先,得到那个类的一个对象实例的地址,然后把这个地址与同一个对象实例的第一个数据成员的地址相比较。如果两者相同,那么, vptr 就有可能是在末尾;如果后者的数值比前者大的话,那么, vptr 就是放在开头部分了。

用下面的程序来查明你的编译器把 vptr 放置在何处的:

class A

{

public:

       virtual void f() {}

       int n;             

};

int main()

{

       A a;

       char* p1 = reinterpret_cast<char*>(&a);

       char* p2 = reinterpret_cast<char*>(&a.n);

       if(p1 == p2)

              cout << “vptr is located at the object’s end” << endl;

       else

              cout << “vptr is located at the object’s beginning” << endl;

}

用可变参数宏(variadic macros)传递可变参数表:【上一篇】
如何在强制类型中定义NULL:【下一篇】
【相关文章】
没有相关文章
【随机文章】
  • 显示多行InfoTips
  • 深圳市福田区教育局成功案例
  • 启动电子商务社区的知识交流
  • ProGuard---JAVA混淆器之一,不错的
  • PHOTOSHOP外挂滤镜终极大法(1)
  • 减少对象的创建提高java性能
  • NTFS解析代码(二)
  • 字符串分解合并的几个函数
  • 在数据库中存储层次数据(转自http://www2.uuzone.com)
  • Dreamweaver构建Blog全程实录(7):用户登录的实现
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.