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] 0x 004111f 9 D::f1(void) *
d.f2的地址为0x 004110c 8,而内存0x00415640处的内容为f9 11 41 00 c 8 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的问题,你看呢?