C++類繼承時的構造函數
前言:
子類需要編寫自己的構造函數和析構函數,需要註意的是,子類隻負責對新增的成員進行初始化和掃尾編寫構造和析構函數,父類成員的初始化和掃尾工作由父類的構造函數和析構函數完成。
無論何種類型的繼承方式,子類都無權訪問父類的所有成員,所以子類對父類的初始化需要父類的構造函數完成。此時,子類的構造函數必須提供父類構造函數所需的參數。
子類構造函數的語法如下:
子類::子類(全部參數表):父類1(父類1參數表),父類2(父類2參數表)
…對象成員1(對象成員1參數表),對象成員2(對象成員2參數表)
其中,“全部參數表”中包含“所有父類所需參數”和“子類新增成員所需參數”;對象成員表示子類新增的對象成員(某些外部類的對象作為子類成員)。
必須指出,子類首先調用父類的構造函數,然後才調用自身的構造函數;如果子類含有多個構造函數,那麼按照子類繼承各個父類時的聲明順序,來調用各個父類的構造函數。
下面定義瞭X、Y和Z三個類,然後Point類繼承這三個類:
class X { public: X(int value) { printf("init X %d \n", value); } }; class Y { public: Y(int value) { printf("init Y %d \n", value); } }; class Z { public: Z() { printf("init Z \n"); } }; class Point: public X, public Y , public z{ public: Point(int value_x, int value_y, int value_point):X(value_x),Y(value_y) { printf("init Point %d \n", value_point); } };
可以看出,Point
類的構造函數“全部參數表”中給出瞭“父類所需參數”和“本類成員所需參數”(此例中Point類沒有對象成員),並以初始化列表的方式對各個父類進行初始化。下面定義Point
類對象,
來查看子類和父類構造函數的調用順序:
int main() { Point p(333, 666, 999); } // 得到下面的結果 init X 333 init Y 666 init Z init Point 999
再次證明:因為Point
聲明時先繼承X類後繼承Y類,所以先調用X構造函數後調用Y構造函數,最後調用Z類構造函數。
此外,某個父類構造函數不需要參數時,子類構造函數可以不考慮此父類,系統會調用該父類默認的構造函數(比如上述的Z類)。如果某個父類即含有需要參數的構造函數,又含有不需參數的構造函數,程序員可自行決定使用哪一個。
通過總結可以得出,子類構造函數代碼運行次序如下:
- 首先,按照父類在繼承聲明時的次序調用對應構造函數;
- 其次,按照子類的對象成員在子類中聲明次序對其進行初始化;
- 最後,執行子類構造函數體;
到此這篇關於C++類繼承時的構造函數的文章就介紹到這瞭,更多相關C++構造函數內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Golang Printf,Sprintf,Fprintf 格式化詳解
- C語言:自定義類型詳解
- 一道面試題教你輕松玩轉C++指針
- C語言創建數組實現函數init,empty,reverse
- 深入淺出理解C語言初識結構體