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

2021-09-27 10:22:30 字數 3956 閱讀 5266

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

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,

44h0040127e cmp ebp,esp

0040128

0 call __chkesp (

0040876

0)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,

44h004012a6 push ebx

004012a7 push esi

004012a8 push edi

004012a9 push ecx

004012aa lea edi,[ebp

-44h]

004012ad mov ecx,

11h004012b2 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,

4004012d2 mov eax,dword ptr [ebp

-4]004012d5 pop edi

004012d6 pop esi

004012d7 pop ebx

004012d8 add esp,

44h004012db 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,

44h00401356 push ebx

00401357 push esi

00401358 push edi

00401359 push ecx

0040135a lea edi,[ebp

-44h]

0040135d mov ecx,

11h00401362 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,

40040137a 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,

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

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

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

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