【轉】C++基類和派生類的構造函數和析構函數的調用


C++基類和派生類的構造函數和析構函數的調用

1.調用順序

  當創建一個派生類的對象時,系統首先自動創建一個基類對象,也就是說,在調用派生類構造函數創建派生類對象之前,系統首先調用基類的構造函數創建基類對象。當派生類對象生命期結束時,首先調用派生類的析構函數,然后調用基類的析構函數。

  所以,構造函數:基類->派生類;析構函數:派生類->基類。

  示例:

 1 #include<iostream>
 2 using namespace std;
 3 
 4 class A
 5 {
 6 public:
 7     A()
 8     {
 9         cout << "Based class A constructor is called" << endl;
10     }
11     ~A()
12     {
13         cout << "Based class A destructor is called" << endl;
14     }
15 };
16 class B :public A
17 {
18 public://不寫public,默認是private
19     B()
20     {
21         cout << "Derived class B constructor is called" << endl;
22     }
23     ~B()
24     {
25         cout << "Derived class B destructor is called" << endl;
26     }
27 };
28 
29 int main()
30 {
31     B b;
32 
33     //system("pause");如果寫這句,VS運行結果只會顯示構造函數,不會顯示析構函數
34     return 0;//將上句注釋,在這句加斷點,手動往下執行一步,可以看到析構函數
35 
36 }

  【運算結果】

2.隱式調用和顯式調用

  通過派生類的構造函數調用基類的構造函數有兩種方式:隱式調用和顯式調用。

  所謂隱式調用,就是在派生類的構造函數中不指定對應的基類的構造函數,這個時候調用的是基類的默認構造函數(即含有默認參數值或不帶參數的構造函數)

  而所謂顯式調用,就是在派生類的構造函數中指定要調用的基類的構造函數,並將派生類構造函數的部分參數值傳遞給基類構造函數。

  注:除非基類有默認的構造函數,否則必須采用顯式調用。

2.1隱式調用示例

 1 #include<iostream>
 2 using namespace std;
 3 
 4 class A
 5 {
 6 public:
 7     A(int x=0,int y=0)
 8     {
 9         a = x; b = y;
10         cout << "Based class A constructor is called" << endl;
11     }
12     ~A()
13     {
14         cout << "Based class A destructor is called" << endl;
15     }
16 private:
17     int a;
18     int b;
19 };
20 //基類A有默認的構造函數,可以隱式調用
21 class B :public A
22 {
23 public://不寫public,默認是private
24     B(int z=0)//B(int z)不能作為默認構造函數所以不可以,B()能作為默認構造函數所以也可以
25     {
26         c = z;
27         cout << "Derived class B constructor is called" << endl;
28     }
29     ~B()
30     {
31         cout << "Derived class B destructor is called" << endl;
32     }
33 private:
34     int c;
35 };
36 int main()
37 {
38     B b;
39     //system("pause");如果寫這句,VS運行結果只會顯示構造函數,不會顯示析構函數
40     return 0;//將上句注釋,在這句加斷點,手動往下執行一步,可以看到析構函數
41 
42 }

2.2顯式調用示例

 1 #include<iostream>
 2 using namespace std;
 3 
 4 class A
 5 {
 6 public:
 7     A(int x,int y)
 8     {
 9         a = x; b = y;
10         cout << "Based class A constructor is called" << endl;
11     }
12     ~A()
13     {
14         cout << "Based class A destructor is called" << endl;
15     }
16 private:
17     int a;
18     int b;
19 };
20 //基類A沒有默認的構造函數,其現有的構造函數需要傳遞參數
21 //通過派生類構造函數調用A的構造函數時,必須用顯式調用
22 class B :public A
23 {
24 public://不寫public,默認是private
25     B(int x,int y,int z):A(x,y)//B(int z)不能作為默認構造函數所以不可以,B()能作為默認構造函數所以也可以
26     {
27         c = z;
28         cout << "Derived class B constructor is called" << endl;
29     }
30     ~B()
31     {
32         cout << "Derived class B destructor is called" << endl;
33     }
34 private:
35     int c;
36 };
37 int main()
38 {
39     B b(1,2,3);
40     //system("pause");如果寫這句,VS運行結果只會顯示構造函數,不會顯示析構函數
41     return 0;//將上句注釋,在這句加斷點,手動往下執行一步,可以看到析構函數
42 
43 }

 

——如有不對的地方,非常歡迎給予指導!

——【感謝】資料來源於http://www.cnblogs.com/krisdy/archive/2009/06/11/1501390.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM