动态联编和静态联编(二)
这就为类的多态性的实现提供了基础;
虚函数按照其声明顺序存放于虚函数表中;
父类的虚函数存放在子类虚函数的前面;
多继承中,每个父类都有自己的虚函数表;
子类的成员函数被存放于第一个父类的虚函数表中;
4.2动态联编举例
最后给大家举个例子,在第三节的那个例子上,下面的代码仅仅是多了一个词:virtual
[cpp]
#include
using namespace std;
class shape{
public:
void virtual draw(){cout<<"I am shape"<
void fun(){draw();}
};
class circle:public shape{
public:
void draw(){cout<<"I am circle"<
00CC15A9 push ebx
};
void main(){
circle oneshape;
oneshape.fun();
}
现在我们再来运行一下程序,输出就变成了I am circle
这里的反汇编代码贴出来,自己有空看看:
[plain]
00CC15A0 push ebp
00CC15A1 mov ebp,esp
00CC15A3 sub esp,0CCh
00CC15AA push esi
00CC15AB push edi
00CC15AC push ecx
00CC15AD lea edi,[ebp-0CCh]
00CC15B3 mov ecx,33h
00CC15B8 mov eax,0CCCCCCCCh
00CC15BD rep stos dword ptr es:[edi]
00CC15BF pop ecx
00CC15C0 mov dword ptr [ebp-8],ecx
00CC15C3 mov eax,dword ptr [this]
00CC15C6 mov edx,dword ptr [eax]
00CC15C8 mov esi,esp
00CC15CA mov ecx,dword ptr [this]
00CC15CD mov eax,dword ptr [edx]
00CC15CF call eax
00CC15D1 cmp esi,esp
00CC15D3 call @ILT+440(__RTC_CheckEsp) (0CC11BDh)
00CC15D8 pop edi
00CC15D9 pop esi
00CC15DA pop ebx
00CC15DB add esp,0CCh
00CC15E1 cmp ebp,esp
00CC15E3 call @ILT+440(__RTC_CheckEsp) (0CC11BDh)
00CC15E8 mov esp,ebp
00CC15EA pop ebp
00CC15EB ret
等自己看了虚函数表之后再来好好理解下。