[cpp]
Father testFunc 1 Child testVFunc 2:1 Child testFunc 0:1 Father testVFunc 1 Child testNFunc 0:1 看看main函数里调用的五个test*Func方法吧,这里有静态的多态,也有动态的多态。编译是静态的,运行是动态的。以下解释C++编译器是怎么形成上述结果的。首先让我们用gcc -S来生成汇编代码,看看main函数里是怎么调用这五个test*Func方法的。
[cpp]
movl $16, %edi call _Znwm movq %rax, %rbx movq %rbx, %rdi call _ZN6FatherC1Ev movq %rbx, -32(%rbp) movq -32(%rbp), %rax movq %rax, -24(%rbp) movl $16, %edi call _Znwm movq %rax, %rbx movq %rbx, %rdi call _ZN5ChildC1Ev movq %rbx, -16(%rbp) movq -16(%rbp), %rdi <span style="color:#ff0000;"> call _ZN6Father8testFuncEv 本行对应pFalseFather->testFunc();</span> movq -16(%rbp), %rax movq (%rax), %rax movq (%rax), %rax movq -16(%rbp), %rdi <span style="color:#ff0000;"> call *%rax 本行对应pFalseFather->testVFunc();</span> movq -24(%rbp), %rdi <span style="color:#ff0000;"> call _ZN5Child8testFuncEv 本行对应pFalseChild->testFunc();</span> movq -24(%rbp), %rax movq (%rax), %rax movq (%rax), %rax movq -24(%rbp), %rdi <span style="color:#ff0000;"> call *%rax 本行对应pFalseChild->testVFunc(); </span> movq -24(%rbp), %rdi <span style="color:#ff0000;"> call _ZN5Child9testNFuncEv 本行对应pFalseChild->testNFunc(); </span> movl $0, %eax addq $40, %rsp popq %rbx leave