首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于继承以后的虚函数调用有关问题,来瞧瞧

2013-04-22 
关于继承以后的虚函数调用问题,高手进来瞧瞧类y虚函数表示意图类b存储结构示意图上面的示意图是从调试的汇

关于继承以后的虚函数调用问题,高手进来瞧瞧


类y虚函数表示意图
关于继承以后的虚函数调用有关问题,来瞧瞧
类b存储结构示意图
关于继承以后的虚函数调用有关问题,来瞧瞧

上面的示意图是从调试的汇编代码总结的:
类b构造函数的部分汇编代码:
004012B0   mov         eax,dword ptr [ebp-4]   //eax存放obj对象地址
004012B3   mov         dword ptr [eax],offset b::`vftable' (0042f028)
004012B9   mov         ecx,dword ptr [ebp-4]   //ecx存放obj对象地址
004012BC   mov         dword ptr [ecx+4],offset b::`vftable' (0042f01c)
从上面看出类b的虚函数表被初始化了两次。
第一次初始化指向类x的虚函数表指针,将其存放在 &obj 的位置。
(0042f028处存放x::bindobj函数地址,0042f028+4处存放b::fx函数地址)
第二次初始化指向类y的虚函数表指针,将其存放在 &obj+4 的位置
(0042f01c处存放y::bindobj函数地址,0042f01c+4处存放b::fy函数地址)

执行bingobj后,px和py都指向&obj;
再看看 px->fx() 汇编码:
1,004011DC   mov         ecx,dword ptr [ebp-0Ch] //ecx存放px指向地址
//下面一句汇编码的意思是将内存地址为ecx的内存所存内容赋值给edx
2,004011DF   mov         edx,dword ptr [ecx]     //edx的值为0042f028
3,004011E1   mov         esi,esp
4,004011E3   mov         ecx,dword ptr [ebp-0Ch]  
5,004011E6   call        dword ptr [edx+4] //edx+4为b::fx函数地址

再看看 py->fy() 汇编码
004011FC   mov         ecx,dword ptr [ebp-10h] //ecx存放py指向地址


004011FF   mov         edx,dword ptr [ecx]     //edx的值为0042f028
00401201   mov         esi,esp
00401203   mov         ecx,dword ptr [ebp-10h]
00401206   call        dword ptr [edx+4]      //edx+4为b::fx函数地址

调用bingobj后,px和py所值地址变为&obj,但是执行fx和fy相应的汇编码没有改变
都是根据类x和类y中fx和fy虚函数偏移量来调用函数。(其实这种行为很容易造成内存错误)
所以都调用b::fx函数咯。

热点排行