看一个程序:
/*
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的问题,你看呢?
/*
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的问题,你看呢?
解决方案 »
- 下面怎么能住文本框内无限次的判断 鼠标按下啊?
- 另开一帖:求教一个执行效率的问题,有C和汇编代码。谁来解释一下,300分都给他
- 求从六个值中选出合理的数值的算法。(寻高手)
- 求助高手,如何将Edit组件的内容清空?
- CComboBox的闹心问题
- connection points 函数回叫如何指定单个client目标?
- 此为何种病毒?
- GetDlgItem()在主線程序和非主線程內使用時的不同!
- 简单问题,在线等候!这样的全局变量在别的文件中怎么声明?请进。。
- 关于CFileFind
- 求介绍几种socket模型的文章 谢谢
- VC中那一个函数与C++ Builder中的ProcessMessage()功能相同?
这个地址有这个问题,有分