关于继承以后的虚函数调用问题,高手进来瞧瞧类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函数咯。