詳解派生類構造函數與析構函數

派生類構造函數與析構函數html

1.派生類構造函數:ios

派生類不能繼承基類的構造函數,必須本身定義構造函數進行新增數據成員初始化工做,若是想同時初始化基類數據成員,必須調用基類構造函數。函數

(1)簡單派生類構造函數:spa

 1 #include <iostream>
 2 
 3 #include <string>
 4 
 5 using namespace std;
 6 
 7  
 8 
 9 class St1
10 
11 {
12 
13 public:
14 
15 //基類構造函數,初始化成員變量
16 
17          St1(int n, string na, char se):num(n),name(na),sex(se){cout<<"St1"<<endl;}
18 
19          ~St1(){cout<<"~St1"<<endl;}
20 
21 protected:
22 
23          int num;
24 
25          string name;
26 
27          char sex;
28 
29 };
30 
31  
32 
33 class St2:public St1
34 
35 {
36 
37 public:
38 
39 //派生類調用基類構造函數
40 
41          St2(int n, string na, char se, int a, string add):St1(n,na,se),age(a),addr(add){cout<<"St2"<<endl;}
42 
43          ~St2(){cout<<"~St2"<<endl;}
44 
45          void display(){cout<<num<<'\t'<<name<<'\t'<<sex<<'\t'<<age<<'\t'<<addr<<endl; }
46 
47 private:
48 
49          int age;
50 
51          string addr;
52 
53 };
54 
55 int main()
56 
57 {
58 
59          St2 s(200, "ace", 'M', 25, "Hangzhou");
60 
61          s.display();
62 
63          return 0;
64 
65 }

輸出:3d

 

(2)包含子對象的派生類構造函數:code

#include <iostream>

#include <string>

using namespace std;

 

class St1

{

public:

//基類構造函數,初始化成員變量

         St1(int n, string na, char se):num(n),name(na),sex(se){cout<<"St1"<<endl;}

         ~St1(){cout<<"~St1"<<endl;}

         void display1(){cout<<num<<'\t'<<name<<'\t'<<sex<<'\t'; }

protected:

         int num;

         string name;

         char sex;

};

 

class St2:public St1

{

public:

//派生類調用基類構造函數

         St2(int n, string na, char se, int n_m, string na_m, char se_m, int a, string add):St1(n,na,se),monitor(n_m,na_m,se_m)

         {age = a; addr = add;cout<<"St2"<<endl;}

         ~St2(){cout<<"~St2"<<endl;}

         void display2(){display1();cout<<age<<'\t'<<addr<<endl; }

         void showmonitor()

         {cout<<"Monitor is:"<<endl;

                   monitor.display1();

                   cout<<endl;}

private:

         int age;

         string addr;

         St1 monitor;//包含子對象

};

int main()

{

         St2 s(200, "ace", 'M', 11, "HH", 'M', 26, "Shanghai");

         s.display2();

         s.showmonitor();

         return 0;

}

 輸出:htm

 

幾點注意:對象

1).在調用派生類構造函數以前,系統會先調用基類的構造函數;若是派生類構造函數列表中包含對基類子對象成員的初始化(如上例中的monitor),每一個基類子對象初始化時也要調用一次基類構造函數;最後纔是派生類調用自身的構造函數來初始化自身新增的成員(如上例中的age,addr)。執行順序就是派生類構造函數列表順序:blog

St2(int n, string na, char se, int n_m, string na_m, char se_m, int a, string add):St1(n,na,se)[1],monitor(n_m,na_m,se_m)[2]繼承

         {age = a; addr = add;cout<<"St2"<<endl;}[3]

2).固然,對上述三種類型進行參數初始化時,會出現如下幾種特殊狀況:

(a) 派生類新增成員不須要進行初始化(很常見):

St2(int n, string na, char se, int n_m, string na_m, char se_m):St1(n,na,se)[1],monitor(n_m,na_m,se_m)[2]{}       

(b)基類沒有定義構造函數或者基類構造函數無參—調用基類默認構造函數

St2(int a, string add ){age = a; addr = add;cout<<"St2"<<endl;}[3]

(c) 基類中重載了構造函數,既有有參的又有無參的,具體調用哪一個視派生類構造函數參數個數而定。

 

 

2.派生類的析構函數【留坑---虛析構函數】:

(1).正如派生類不能繼承基類的構造函數,派生類也不能繼承基類的析構函數,派生類的清理工做由派生自身析構函數負責,基類的清理工做由基類析構函數負責。

(2).析構函數的調用順序正好和構造函數調用順序相反,即先調用派生類析構函數清理新增的成員,再調用子對象析構函數(基類析構函數)清理子對象,最後再調用基類析構函數清理基類成員。

相關文章
相關標籤/搜索