[C++ MFC VC] 虚函数表指针的位置
2008-01-10 08:58
288 查看
编译器会把一种叫虚指针(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;
}
一些编译器(例如: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;
}
相关文章推荐
- VC/C++/MFC 获取IE浏览器的滚动条位置
- C++指向虚函数表指针存放位置
- C++下this指针实现机制分析(针对vc++ 6.0)
- C++虚函数表(vtable)和虚函数指针(vfptr)
- vc 热键、组合键的用法 MFC c++ hotkey WM_HOTKEY
- VC MFC 获取屏幕大小 程序窗口大小位置 控件大小位置
- C++、VC、MFC 计算任意函数值、计算表达式、积分、线性方程组
- 孙鑫VC学习笔记:第八讲 逃跑按钮的巧妙实现和MFC中指针的获取
- C++ MFC 其他函数获得主对话框指针并使用成员的方法
- [C++ VC MFC]巧妙程序自删除
- C++虚函数多继承的虚函数表指针的测试
- C++虚函数表指针的值
- C++玩转虚函数表指针-在类外面调用类中私有函数
- VC MFC SDI/MDI框架各部分指针获取方式
- 从零开始学C++之虚函数与多态(一):虚函数表指针、虚析构函数、object slicing与虚函数、C++对象模型图 .
- C/C++/VC MFC----char & int---study
- C++ vptr vtbl (C++虚表指针,虚函数表,虚函数的实现)很多人都喜欢问这个,写下吧。
- C++的多态性实现机制剖析(即VC视频第3课this指针讲解)[程序员之家论坛]
- 接触VC之二:MFC类基础,C++程序编写规范
- vc 热键、组合键的用法 MFC c++ hotkey WM_HOTKEY