#include "stdio.h"
class
A
{
public
:
int
a = 1;
public
:
virtual
void
AF() {
printf
(
"AF run...\n"
);
printf
(
"a=%d\n"
,
this
->a);
}
};
class
B:
public
A
{
public
:
int
a = 2;
public
:
virtual
void
AF() {
printf
(
"BF run...\n"
);
printf
(
"a=%d\n"
,
this
->a);
}
};
int
main()
{
A a;
B b;
A* ptr;
ptr = &a;
ptr->AF();
ptr = &b;
ptr->AF();
a.AF();
}
运行结果:
AF run...
a=1
BF run...
a=2
AF run...
a=1
——————————————————————————————汇编代码————————————————————————————————
A a;
00351D1F 8D 4D F0 lea ecx,[a]
00351D22 E8 DA F6 FF FF call A::A (0351401h)
B b;
00351D27 8D 4D DC lea ecx,[b]
00351D2A E8 10 F5 FF FF call B::B (035123Fh)
A* ptr;
ptr = &a;
00351D2F 8D 45 F0 lea eax,[a]
00351D32 89 45 D0 mov dword ptr [ptr],eax
ptr->AF();
00351D35 8B 45 D0 mov eax,dword ptr [ptr]
00351D38 8B 10 mov edx,dword ptr [eax]
00351D3A 8B F4 mov esi,esp
00351D3C 8B 4D D0 mov ecx,dword ptr [ptr]
00351D3F 8B 02 mov eax,dword ptr [edx]
00351D41 FF D0 call eax
00351D43 3B F4 cmp esi,esp
00351D45 E8 63 F5 FF FF call __RTC_CheckEsp (03512ADh)
ptr = &b;
00351D4A 8D 45 DC lea eax,[b]
00351D4D 89 45 D0 mov dword ptr [ptr],eax
ptr->AF();
00351D50 8B 45 D0 mov eax,dword ptr [ptr]
00351D53 8B 10 mov edx,dword ptr [eax]
00351D55 8B F4 mov esi,esp
00351D57 8B 4D D0 mov ecx,dword ptr [ptr]
00351D5A 8B 02 mov eax,dword ptr [edx]
00351D5C FF D0 call eax
00351D5E 3B F4 cmp esi,esp
00351D60 E8 48 F5 FF FF call __RTC_CheckEsp (03512ADh)
a.AF();
00351D65 8D 4D F0 lea ecx,[a]
00351D68 E8 07 F7 FF FF call A::AF (0E01474h)