c++ 子類構造函數初始化及父類構造初始化

  咱們知道,構造方法是用來初始化類對象的。若是在類中沒有顯式地聲明構造函數,那麼編譯器會自動建立一個默認的構造函數;而且這個默認的構造函數僅僅在沒有顯式地聲明構造函數的狀況下才會被建立建立。函數

  構造函數與父類的其它成員(成員變量和成員方法)不一樣,它不能被子類繼承。所以,在建立子類對象時,爲了初始化從父類中繼承來的成員變量,編譯器須要調用其父類的構造函數。若是子類的構造函數沒有顯示地調用父類的構造函數,則默認調用父類的無參構造函數,至於什麼事顯式調用,在下面會詳細說明!關於子類中構造函數的構造原則,總結以下,歡迎你們指導與批評。this

  1.父類沒有聲明構造函數spa

    (1)子類也沒有聲明本身的構造函數,則父類和子類均由編譯器生成默認的構造函數。3d

    (2)子類中聲明瞭構造函數(無參或者帶參),則子類的構造函數能夠寫成任何形式,不用顧忌父類的構造函數。在建立子類對象時,先調用父類默認的構造函數(編譯器自動生成),再調用子類的構造函數。code

  2.父類只聲明瞭無參構造函數對象

    若是子類的構造函數沒有顯式地調用父類的構造,則將會調用父類的無參構造函數。也就是說,父類的無參構造函數將會被隱式地調用。blog

  3.父類只聲明瞭帶參構造函數繼承

    在這種狀況下,要特別注意。由於父類只有帶參的構造函數,因此若是子類中的構造函數沒有顯示地調用父類的帶參構造函數,則會報錯,因此必需顯示地調用。關於構造函數的顯示調用,參見下例。編譯器

 1 class animal  2 {  3 protected:       //成員變量,聲明爲protected或者public,這裏選擇protected
 4     int height;  //若聲明爲private,則不能被子類繼承訪問,會報錯
 5     int weight;  6 public:  7     animal(int height,int weight)   //帶參的構造函數
 8  {  9         this->height=height; 10         this->weight=weight; 11         cout<<"animal的帶參構造函數被調用"<<endl; 12  } 13     virtual ~animal() 14  { 15         cout<<"animal的析構函數被調用"<<endl; 16  } 17 }; 18 //子類
19 class fish:public animal 20 { 21 public: 22     fish():animal(height,weight) //顯示調用父類的構造函數
23  { 24         cout<<"fish的構造函數被調用"<<endl; 25  } 26     virtual ~fish() 27  { 28         cout<<"fish的析構函數被調用"<<endl; 29  } 30 };

  在子類fish的構造函數中,加上一個冒號(:),而後加上父類的帶參構造函數,這就是父類構造函數的顯式調用。這樣,在子類的構造函數被調用時,系統就會去調用父類的帶參構造函數,從而實現初始化父類的成員變量。運行結果以下:編譯

  4.父類同時聲明瞭無參和帶參構造函數

    在這種狀況下,子類只須要實現父類的一個構造函數便可,無論是無參的仍是帶參的構造函數。若是子類的構造函數沒有顯示地調用父類的構造函數(無參或帶參),則默認調用父類的無參構造函數。

 1 //父類
 2 class animal
 3 {
 4 protected:       //成員變量,聲明爲protected或者public,這裏選擇protected
 5     int height;  //若聲明爲private,則不能被子類繼承訪問,會報錯
 6     int weight;
 7 public:    
 8     animal()
 9     {
10         height=0;
11         weight=0;
12         cout<<"animal的無參構造函數被調用"<<endl;
13     }
14     animal(int height,int weight)   //帶參的構造函數
15     {
16         this->height=height;
17         this->weight=weight;
18         cout<<"animal的帶參構造函數被調用"<<endl;
19     }
20     virtual ~animal()
21     {
22         cout<<"animal的析構函數被調用"<<endl;
23     }
24 };
25 //子類
26 class fish:public animal
27 {
28 public:
29     fish()     //沒有顯示地調用父類的構造函數(無參或帶參),則默認調用父類的無參構造函數
30     {
31         cout<<"fish的構造函數被調用"<<endl;
32     }
33     virtual ~fish()
34     {
35         cout<<"fish的析構函數被調用"<<endl;
36     }
37 };

  運行結果以下:

  總結以上幾條,能夠概括出C++中子類繼承父類時構造函數的寫法的規律:當父類有顯式地聲明瞭構造函數時,子類最低限度的實現父類中的一個;當父類沒有聲明構造函數時,子類能夠不聲明構造函數或者任意地書寫構造函數。

相關文章
相關標籤/搜索