一些编译器(例如: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;
}