C++的多态如何在编译和运行期实现(2)

[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  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wyggfy.html