今天通过汇编角度在次理解一下虚函数.
工作环境VC6
方法DEBUG 跟踪MEMORY
测试程序代码 虽然是测试程序但希望大家还是养成良好习惯 不要污染命名空间
测试代码:
#include "iostream"
using std::cout;
using std::endl;
class a
{
int m_a;
public:
a(int x):m_a(x) {}
virtual void display()
{
cout<<"a is running !"<<endl;
}
};
class b : public a
{
public:
b(int y):a(y) {}
void display()
{
cout<<"b is running !"<<endl;
}
};
class c : public b
{
public:
c(int z):b(z) {}
void display()
{
cout<<"c is running !"<<endl;
}
};
int main()
{
a ca(1);
b cb(2);
c cc(3);
a * p[3]={ &ca , &cb , &cc };
p[0]->display();
p[1]->display();
p[2]->display();
return 0;
}
输出结果就不用多说了,如果你还不能想到正确结果 那先看一下基础知识在看这篇文章.
先看一下生成的汇编代码
39: int main()
40: {
004011A0 push ebp
004011A1 mov ebp,esp
004011A3 sub esp,64h
004011A6 push ebx
004011A7 push esi
004011A8 push edi
004011A9 lea edi,[ebp-64h]
004011AC mov ecx,19h
004011B1 mov eax,0CCCCCCCCh
004011B6 rep stos dword ptr [edi]
41: a ca(1);
004011B8 push 1
004011BA lea ecx,[ebp-8]
004011BD call @ILT+95(a::a) (00401064)
42: b cb(2);
004011C2 push 2
004011C4 lea ecx,[ebp-10h]
004011C7 call @ILT+10(b::b) (0040100f)
43: c cc(3);
004011CC push 3
004011CE lea ecx,[ebp-18h]
004011D1 call @ILT+105(c::c) (0040106e)
44:
45: a * p[3]={ &ca , &cb , &cc };
004011D6 lea eax,[ebp-8]
004011D9 mov dword ptr [ebp-24h],eax
004011DC lea ecx,[ebp-10h]
004011DF mov