利用函数指针取虚表函数引发的错误[求解释] 本帖最后由 sunshinelzy 于 2011-09-26 20:08:10 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 楼主,你要知道1.成员函数和普通函数是不一样的,2.虚拟成员函数在虚表中的顺序一般是按在类中的顺序存放到虚表中先说你说的将析构函数放在后面就不会出错的情况吧,1.因为虚拟成员函数在虚表中的顺序一般是按在类中的顺序存放到虚表中,所以此时虚表中第一个函数地址是虚拟函数Fun1的地址(派生类重写过的),所以你间接调用的是这个函数地址2.因为成员函数有个隐藏的this指针(一般通过ECX传递),又由于在这个虚拟函数中并没有访问成员,所以尽管此时在成员函数体内ECX中的值是垃圾也没有导致错误而当你的析构函数放在Fun1之前时,此时虚表中第一个函数地址是析构函数的地址(派生类重写过的),所以在你间接调用的时候,调用的是派生类析构函数,而在析构函数中会用到ECX寄存器(比如在派生类的析构函数中会设置派生类的VPTR和静态调用基类的析构函数),因在间接调用的时候没有传递ECX,所以此时ECX的值是哥垃圾值,出现运行错误就很正常了 使用贴图方式做的界面皮肤,有问题不知怎样解决 非活动窗口怎么获得鼠标点击的信息 First-chance exception int xx.exe(Kernel32.dll): 0x40010005 listctrl控件中怎样让标题栏多行显示? 不能显示对话框 加解密专家请进(DES) 请问ActiveX Ocx中这种属性的下拉功能如何实现? 急需要五子棋设计的算法程序! 1000元求助,VC网络编程,要求可以发送和接收数据包。 vc中宏的定义 高手,如何利用多媒体定时器定时从文件取数据(在工作线程中完成) 绘制曲线问题
1.成员函数和普通函数是不一样的,
2.虚拟成员函数在虚表中的顺序一般是按在类中的顺序存放到虚表中先说你说的将析构函数放在后面就不会出错的情况吧,
1.因为虚拟成员函数在虚表中的顺序一般是按在类中的顺序存放到虚表中,所以此时虚表中第一个函数地址是虚拟函数Fun1的地址(派生类重写过的),所以你间接调用的是这个函数地址
2.因为成员函数有个隐藏的this指针(一般通过ECX传递),又由于在这个虚拟函数中并没有访问成员,所以尽管此时在成员函数体内ECX中的值是垃圾也没有导致错误而当你的析构函数放在Fun1之前时,此时虚表中第一个函数地址是析构函数的地址(派生类重写过的),
所以在你间接调用的时候,调用的是派生类析构函数,而在析构函数中会用到ECX寄存器(比如在派生类的析构函数中会设置派生类的VPTR和静态调用基类的析构函数),因在间接调用的时候没有传递ECX,所以此时ECX的值是哥垃圾值,出现运行错误就很正常了