看一个程序:
/*
Abstract    : 
Author      : Lijie Wang
Environment : Visual C++.NET 2005
History     : 2006-10-30
*/
class B
{
private:
virtual void f1(){};
};class D:public B
{
private:
void f1(){};
virtual void f2(){};
};void main()
{
  D d;
}
通过Watch窗口查看到的d对象的结构如下所示:
 名称                       值                              类型
- d {...} D
- B {...} B
- __vfptr 0x00415640 const D::`vftable' *
[0] 0x004111f9 D::f1(void) *
d.f2的地址为0x004110c8,而内存0x00415640处的内容为f9 11 41 00 c8 10 41 00。可以看到d只有一个__vfptr(其实是B-subobject的__vfptr)。因为f2是D的虚函数,所以D::f2应该在D的vftable,因为D只有一个vftable,所以D::f2应该插入D的B-subobject的vftable中,而根据内存地址可以看出,D::f2也的确在D::f1之后。但是Watch窗口的显示D的vftable中只有覆盖B::f2的D::f1,而没有D::f2。所以因我觉得是IDE的debug模块的显示有问题。另外,你改了函数名再重新调试可以看到,显示的d对象结构中函数名会出现混乱,尤其是多继承的时候,但是如果将改过的程序拷贝到新建的project中,就不会出现这种混乱,这应该也算是一个问题吧。我觉得这是VC++.NET2005的问题,你看呢?