繼承是類的乙個基本屬性,可是在類的繼承過程中,函式是怎麼初始化?怎麼析構的呢?我們不妨看看下面這樣的一段**?
看到上面的**,相信大家也明白了,我們定義了這樣乙個類。基類是empoyee,繼承類是manager。我們看到manager是一種特殊的employee,那麼在記憶體構建和析構的時候函式又是怎麼安排的呢?
class
employee
~employee()
};class
manager :
public employee
~manager()
};
我們發現manager的構造和析構其實也簡單。建構函式其實就是在變數出現的時候進行構造。那什麼時候析構呢?也就在函式快結束的時候進行析構。下面我們可以進一步討論在manager的構造和析構究竟是怎麼做的?
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的構造裡面新增了employee的預設建構函式,那麼析構函式呢?
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率先構造,然後列印manager;析構的時候,恰恰相反,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
【預告:下面主要討論類的虛函式】
用彙編的眼光看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 看到上面的 相信大家也明白了,...