从汇编看c++中的多态详解

2020-01-06 15:23:17王振洲

从拷贝函数可以看出,临时对象只拷贝了y的所包含的的父对象部分(y被切片了),并且临时对象的vptr指针也初始化为类X的vtable首地址。

下面是函数f的汇编码:


; 24  : void f(X x) {

  push  ebp
  mov  ebp, esp

; 25  :   x.b();

  lea  ecx, DWORD PTR _x$[ebp];将参数x的首地址给ecx,作为隐含参数传递给成员函数b
  call  ?b@X@@UAEXXZ        ; 调用x中的成员函数b 这里是用对象直接调用,因此没有访问vtable

这里调用的是类X里面的成员函数,并且没有访问虚表vtable

下面是类X里面的虚成员函数b的汇编码:


?b@X@@UAEXXZ PROC          ; X::b, COMDAT
; _this$ = ecx

; 8  :   virtual void b() {

  push  ebp
  mov  ebp, esp
  push  ecx;为保存对象首地址预留4byte空间
  mov  DWORD PTR _this$[ebp], ecx;ecx中保存有对象x的首地址,放到刚才预留的空间

; 9  :     i = 2;

  mov  eax, DWORD PTR _this$[ebp];将x首地址给eax
  mov  DWORD PTR [eax+4], 2;将2写给偏移x首地址4byte处,即将2赋给x的成员变量i

; 10  :   }

  mov  esp, ebp
  pop  ebp
  ret  0
?b@X@@UAEXXZ ENDP

以上这篇从汇编看c++中的多态详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持ASPKU。


注:相关教程知识阅读请移步到C++教程频道。