本帖最后由 sunshinelzy 于 2011-09-26 20:08:10 编辑

解决方案 »

  1.   

    楼主,你要知道
    1.成员函数和普通函数是不一样的,
    2.虚拟成员函数在虚表中的顺序一般是按在类中的顺序存放到虚表中先说你说的将析构函数放在后面就不会出错的情况吧,
    1.因为虚拟成员函数在虚表中的顺序一般是按在类中的顺序存放到虚表中,所以此时虚表中第一个函数地址是虚拟函数Fun1的地址(派生类重写过的),所以你间接调用的是这个函数地址
    2.因为成员函数有个隐藏的this指针(一般通过ECX传递),又由于在这个虚拟函数中并没有访问成员,所以尽管此时在成员函数体内ECX中的值是垃圾也没有导致错误而当你的析构函数放在Fun1之前时,此时虚表中第一个函数地址是析构函数的地址(派生类重写过的),
    所以在你间接调用的时候,调用的是派生类析构函数,而在析构函数中会用到ECX寄存器(比如在派生类的析构函数中会设置派生类的VPTR和静态调用基类的析构函数),因在间接调用的时候没有传递ECX,所以此时ECX的值是哥垃圾值,出现运行错误就很正常了