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的问题,你看呢?
本文探讨了在Visual C++.NET 2005环境中,虚函数表在内存中的布局方式及其在调试过程中的表现。通过一个简单的示例程序,展示了基类与派生类虚函数的存储情况,并指出了IDE在显示虚函数表时可能出现的问题。
4060

被折叠的 条评论
为什么被折叠?



