从拷贝函数可以看出,临时对象只拷贝了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++教程频道。










