由於衍生類別包含基底類別的原因,我們在建立一個衍生類別的時候,系統會先建立一個基底類別。要注意的是,衍生類別會吸收基底類別的全部成員,但不包括構造函數及後面講的析構函數,那麼就意味著創建派生類別在調用自己的構造函數之前,會先調用基類的構造函數。
這裡一點我們可以透過程式碼驗證:
#include<iostream>usingnamespacestd;classClock{private:intH;intM;intS;public:Clock(){cout<<Clock'sConstructorCalled!<<endl;}};classAlarmClock:publicClock{private:intAH;intAM;public:AlarmClock (){cout<<AlarmClock'sConstructorCalled!<<endl;}};intmain(){AlarmClockA;return0;}
運行截圖如下:
我們可以看到僅僅定義了一個派生類別對象,派生類別和基底類別的建構函數會自動調用,調用順序是先調用基底類別的建構函數再調用派生類別的建構函數。
以上大家看到的是最常見也最簡單的呼叫方法,這只是隱式的,也就是不用寫出來的、自動的呼叫。那麼當基底類別的建構子是帶參數的情況下如何呼叫呢?這樣還可以嗎?如何傳參呢?
答:那就需要我們顯式的,也就是明確的寫出來,並指定參數傳遞,來告訴編譯器。
一般的寫法格式為:
衍生類別建構函式名(總形參表列):基底類別建構子(實參表列)
例如程式碼:
#include<iostream>usingnamespacestd;classClock{private:intH;intM;intS;public:Clock(){cout<<Clock'sConstructorCalled!<<endl;}Clock(inth,intm,ints){this->H=h ;this->M=m;this->S=s;cout<<Clock'sConstructorwithparameterCalled!<<endl;}};classAlarmClock:publicClock{private:intAH;intAM;public:AlarmClock(){cout<<AlarmClock' sConstructorCalled!<<endl;}AlarmClock(inth,intm,ints):Clock(h,m,s){cout<<AlarmClock'sConstructorwithparameterCalled!<<endl;}};intmain(){AlarmClockA(8,10,30 );AlarmClockB;return0;}
大家注意看衍生類別的建構函數,後面透過冒號跟基底類別的傳參,而基底類別裡的參數裡為實參,來實現顯示的參數呼叫。請大家上機實作!
需要注意的是,一旦基底類別中有帶參數的建構函數,衍生類別中則必須有明確傳參的衍生類別建構函數,來實現基底類別中參數的傳遞,完成初始化工作。