C++语言程序设计

main函数分为两部分，从第一部分可以很清楚的看到没有虚函数的类的长度是4，就是所有成员变量的长度，带一个或多个虚函数的类的长度是8，是所有成员变量加上一个VPTR的长度，因为这只是指向VTABLE表的指针，所以带几个虚函数对这个指针是不起作用的，它们只影响VTABLE表的长度。
从第二部分可以看到，B类对象b的大小是8个字节，即两个整型的大小，从我们改变它的成员变量a的值前后两个整型单元的数值，我们可以看到，第一个整型单元的值没有改变，第二个整型单元的值从0变成1，这正是成员变量a的位置。第一个整型单元是什么呢？这就是VPTR所在的位置。第二部分告诉我们VPTR的位置是在这个类的开始，并且永远处在类的开始位置。将来定义了这个类的对象以后，该对象指针的位置就是这个VPTR的位置。
这里可能有个疑问，如果一个类里面没有成员变量，那怎么办？它的对象的长度岂不是要变成0，一个0长度的数据的地址是什么？即使分配给它一个地址，当给下一个对象分配空间时，岂不是要与这个对象的地址相同。为了避免这个问题，编译器强制这个类的对象的长度非0，如果这个类没有任何成员变量，也没有虚函数，即理论上它的对象的长度是0，但是，编译器会向这个对象中插入一个"哑"成员。当类中仅有虚函数时，该对象中仅有一个VPTR。如果将上面程序的所有成员变量全注释掉，再重新编译运行程序，我们就会看到这种情况。
程序运行结果是：
没有虚函数的类大小是1
有一个虚函数的类大小是4
有两个虚函数的类大小是4
我们已经清楚VPTR，下面我们来讨论VTABLE的构造。
每个包含虚函数的类都有自己的VTABLE表，VTABLE表中存放各自类的虚函数地址，对于没有重定义的虚函数使用基类函数的地址。不管怎样，在每个类中总要有全体虚函数的地址，并且虚函数地址在各自表中的顺序必须一致，因为在函数查找时，只是根据VPTR加上一个偏移量来确定某个虚函数，如果VTABLE表的虚函数不全，或者顺序不对，就不可能查到正确的函数地址。