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

2021-05-28 04:55:41 字數 3567 閱讀 6439

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

class employee

~employee()

};class manager : public employee

~manager()

};

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

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的構造和析構究竟是怎麼做的?

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的預設建構函式,那麼析構函式呢?

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 (之類繼承)

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

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

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

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

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