国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

解析C++中多層派生時的構造函數及一些特殊形式

2020-05-23 14:14:10
字體:
來源:轉載
供稿:網友

這篇文章主要介紹了解析C++中多層派生時的構造函數及一些特殊形式,特殊形式主要針對基類和子對象類型的構造函數內容,需要的朋友可以參考下

C++多層派生時的構造函數

一個類不僅可以派生出一個派生類,派生類還可以繼續派生,形成派生的層次結構。在上面敘述的基礎上,不難寫出在多級派生情況下派生類的構造函數。

通過例下面的程序,讀者可以了解在多級派生情況下怎樣定義派生類的構造函數。相信大家完全可以自己看懂這個程序。

[例] 多級派生情況下派生類的構造函數。

 

 
  1. #include <iostream> 
  2. #include<string> 
  3. using namespace std; 
  4. class Student//聲明基類 
  5. public://公用部分 
  6. Student(int n, string nam)//基類構造函數 
  7. num=n; 
  8. name=nam; 
  9. void display( )//輸出基類數據成員 
  10. cout<<"num:"<<num<<endl; 
  11. cout<<"name:"<<name<<endl; 
  12. protected://保護部分 
  13. int num;//基類有兩個數據成員 
  14. string name; 
  15. }; 
  16. class Student1: public Student//聲明公用派生類Student1 
  17. public
  18. Student1(int n,char nam[10],int a):Student(n,nam)//派生類構造函數 
  19. {age=a;}//在此處只對派生類新增的數據成員初始化 
  20. void show( ) //輸出num,name和age 
  21. display( ); //輸出num和name 
  22. cout<<"age: "<<age<<endl; 
  23. private://派生類的私有數據 
  24. int age; //增加一個數據成員 
  25. }; 
  26. class Student2:public Student1 //聲明間接公用派生類Student2 
  27. public://下面是間接派生類構造函數 
  28. Student2(int n, string nam,int a,int s):Student1(n,nam,a) {score=s;} 
  29. void show_all( ) //輸出全部數據成員 
  30. show( ); //輸出num和name 
  31. cout<<"score:"<<score<<endl; //輸出age 
  32. private
  33. int score; //增加一個數據成員 
  34. }; 
  35. int main( ) 
  36. Student2 stud(10010,"Li",17,89); 
  37. stud.show_all( ); //輸出學生的全部數據 
  38. return 0; 

運行時的輸出如下:

 

 
  1. num:10010 
  2. name:Li 
  3. age:17 
  4. score:89 

請注意基類和兩個派生類的構造函數的寫法。

基類的構造函數首部:

 

 
  1. Student(int n, string nam) 

派生類Student1的構造函數首部:

 

 
  1. Student1(int n, string nam],int a):Student(n,nam) 

派生類Student2的構造函數首部:

 

 
  1. Student2(int n, string nam,int a,int s):Student1(n,nam,a) 

注意不要寫成:

 

 
  1. Student2(int n, string nam,int a,int s):Student1(n,nam),student1(n, nam, a) 

不要列出每一層派生類的構造函數,只需寫出其上一層派生類(即它的直接基類)的構造函數即可。在聲明Student2類對象時,調用Student2構造函數;在執行Student2構造函數時,先調用Student1構造函數;在執行Student1構造函數時,先調用基類Student構造函數。初始化的順序是:

先初始化基類的數據成員num和name。

再初始化Student1的數據成員age。

最后再初始化Student2的數據成員score。

C++派生類構造函數的特殊形式

在使用派生類構造函數時,有以下特殊的形式。

1) 當不需要對派生類新增的成員進行任何初始化操作時,派生類構造函數的函數體可以為空,即構造函數是空函數,函數體為空時,派生類構造函數的參數個數等于基類構造函數和子對象的參數個數之和,派生類構造函數的全部參數都傳遞給基類構造函數和子對象,在調用派生類構造函數時不對派生類的數據成員初始化。此派生類構造函數的作用只是為了將參數傳遞給基類構造函數和子對象,并在執行派生類構造函數時調用基類構造函數和子對象構造函數。在實際工作中常見這種用法。

2) 如果在基類中沒有定義構造函數,或定義了沒有參數的構造函數,那么在定義派生類構造函數時可不寫基類構造函數。因為此時派生類構造函數沒有向基類構造函數傳遞參數的任務。調用派生類構造函數時系統會自動首先調用基類的默認構造函數。

如果在基類和子對象類型的聲明中都沒有定義帶參數的構造函數,而且也不需對派生類自己的數據成員初始化,則可以不必顯式地定義派生類構造函數。因為此時派生類構造函數既沒有向基類構造函數和子對象構造函數傳遞參數的任務,也沒有對派生類數據成員初始化的任務。

在建立派生類對象時,系統會自動調用系統提供的派生類的默認構造函數,并在執行派生類默認構造函數的過程中,調用基類的默認構造函數和子對象類型默認構造函數。

如果在基類或子對象類型的聲明中定義了帶參數的構造函數,那么就必須顯式地定義派生類構造函數,并在派生類構造函數中寫出基類或子對象類型的構造函數及其參數表。

如果在基類中既定義無參的構造函數,又定義了有參的構造函數(構造函數重載),則在定義派生類構造函數時,既可以包含基類構造函數及其參數,也可以不包含基類構造函數。

在調用派生類構造函數時,根據構造函數的內容決定調用基類的有參的構造函數還是無參的構造函數。編程者可以根據派生類的需要決定采用哪一種方式。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 宜阳县| 江口县| 河东区| 丹巴县| 古蔺县| 唐山市| 万州区| 吉安县| 织金县| 牡丹江市| 灵石县| 搜索| 沅陵县| 绥德县| 定州市| 河北省| 科技| 紫云| 凤翔县| 乌苏市| 乐都县| 招远市| 桐庐县| 平潭县| 元阳县| 磐石市| 保靖县| 涟源市| 连城县| 东兴市| 建水县| 那坡县| 霞浦县| 偃师市| 紫云| 忻城县| 唐山市| 榆树市| 台州市| 青海省| 惠安县|