用彙編的眼光看C (之類繼承)

2021-05-28 08:40:17 字數 3779 閱讀 3012

繼承是類的乙個基本屬性,可是在類的繼承過程中,函式是怎麼初始化?怎麼析構的呢?我們不妨看看下面這樣的一段**?

view plain

class

employee  

~employee()   

};  

class

manager : 

public

employee  

~manager()   

};  

看到上面的**,相信大家也明白了,我們定義了這樣乙個類。基類是empoyee,繼承類是manager。我們看到manager是一種特殊的employee,那麼在記憶體構建和析構的時候函式又是怎麼安排的呢?

view plain

74:       manager m;  

00401268   lea         ecx,[ebp-4]  

0040126b   call        @ilt+60(manager::manager) (00401041)  

75:   }  

00401270   lea         ecx,[ebp-4]  

00401273   call        @ilt+0(manager::~manager) (00401005)  

00401278   pop         edi  

00401279   pop         esi  

0040127a   pop         ebx  

0040127b   add         esp,44h  

0040127e   cmp         ebp,esp  

00401280   call        __chkesp (00408760)  

00401285   mov         esp,ebp  

00401287   pop         ebp  

我們發現manager的構造和析構其實也簡單。建構函式其實就是在變數出現的時候進行構造。那什麼時候析構呢?也就在函式快結束的時候進行析構。下面我們可以進一步討論在manager的構造和析構究竟是怎麼做的?

view plain

65:   

class

manager : 

public

employee  

66:     

004012a0   push        ebp  

004012a1   mov         ebp,esp  

004012a3   sub         esp,44h  

004012a6   push        ebx  

004012a7   push        esi  

004012a8   push        edi  

004012a9   push        ecx  

004012aa   lea         edi,[ebp-44h]  

004012ad   mov         ecx,11h  

004012b2   mov         eax,0cccccccch  

004012b7   rep stos    dword ptr [edi]  

004012b9   pop         ecx  

004012ba   mov         dword ptr [ebp-4],ecx  

004012bd   mov         ecx,dword ptr [ebp-4]  

004012c0   call        @ilt+40(employee::employee) (0040102d)  

004012c5   push        offset string "manager()!\n"

(00431020)  

004012ca   call        printf (004086e0)  

004012cf   add         esp,4  

004012d2   mov         eax,dword ptr [ebp-4]  

004012d5   pop         edi  

004012d6   pop         esi  

004012d7   pop         ebx  

004012d8   add         esp,44h  

004012db   cmp         ebp,esp  

004012dd   call        __chkesp (00408760)  

004012e2   mov         esp,ebp  

004012e4   pop         ebp  

004012e5   ret  

我們發現,manager的構造裡面新增了employee的預設建構函式,那麼析構函式呢?

view plain

69:       ~manager()   

00401350   push        ebp  

00401351   mov         ebp,esp  

00401353   sub         esp,44h  

00401356   push        ebx  

00401357   push        esi  

00401358   push        edi  

00401359   push        ecx  

0040135a   lea         edi,[ebp-44h]  

0040135d   mov         ecx,11h  

00401362   mov         eax,0cccccccch  

00401367   rep stos    dword ptr [edi]  

00401369   pop         ecx  

0040136a   mov         dword ptr [ebp-4],ecx  

0040136d   push        offset string "~maneger()!\n"

(00431040)  

00401372   call        printf (004086e0)  

00401377   add         esp,4  

0040137a   mov         ecx,dword ptr [ebp-4]  

0040137d   call        @ilt+5(employee::~employee) (0040100a)  

00401382   pop         edi  

00401383   pop         esi  

00401384   pop         ebx  

00401385   add         esp,44h  

00401388   cmp         ebp,esp  

0040138a   call        __chkesp (00408760)  

0040138f   mov         esp,ebp  

00401391   pop         ebp  

00401392   ret  

我們發現,manager構造的時候employee率先構造,然後列印manager;析構的時候,恰恰相反,manager首先析構自己,然後在再呼叫employee的析構函式,上面的彙編**證明了一切。

用彙編的眼光看C (之類繼承)

繼承是類的乙個基本屬性,可是在類的繼承過程中,函式是怎麼初始化?怎麼析構的呢?我們不妨看看下面這樣的一段 class employee employee class manager public employee manager 看到上面的 相信大家也明白了,我們定義了這樣乙個類。基類是empoye...

用彙編的眼光看C (之類繼承)

繼承是類的乙個基本屬性,可是在類的繼承過程中,函式是怎麼初始化?怎麼析構的呢?我們不妨看看下面這樣的一段 cpp view plain copy class employee employee class manager public employee manager 看到上面的 相信大家也明白了,...

用彙編的眼光看C (之類繼承)

繼承是類的乙個基本屬性,可是在類的繼承過程中,函式是怎麼初始化?怎麼析構的呢?我們不妨看看下面這樣的一段 class employee employee class manager public employee manager 看到上面的 相信大家也明白了,我們定義了這樣乙個類。基類是empoye...