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

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

詳解C++編程中多級派生時的構造函數和訪問屬性

2020-01-26 14:51:27
字體:
來源:轉載
供稿:網友

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

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

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

#include <iostream>#include<string>using namespace std;class Student//聲明基類{public://公用部分  Student(int n, string nam)//基類構造函數  {   num=n;   name=nam;  }  void display( )//輸出基類數據成員  {   cout<<"num:"<<num<<endl;   cout<<"name:"<<name<<endl;  }protected://保護部分  int num;//基類有兩個數據成員  string name;};class Student1: public Student//聲明公用派生類Student1{public:  Student1(int n,char nam[10],int a):Student(n,nam)//派生類構造函數  {age=a;}//在此處只對派生類新增的數據成員初始化  void show( ) //輸出num,name和age  {   display( ); //輸出num和name   cout<<"age: "<<age<<endl;  }private://派生類的私有數據  int age; //增加一個數據成員};class Student2:public Student1 //聲明間接公用派生類Student2{public://下面是間接派生類構造函數  Student2(int n, string nam,int a,int s):Student1(n,nam,a) {score=s;}  void show_all( ) //輸出全部數據成員  {   show( ); //輸出num和name   cout<<"score:"<<score<<endl; //輸出age  }private:  int score; //增加一個數據成員};int main( ){  Student2 stud(10010,"Li",17,89);  stud.show_all( ); //輸出學生的全部數據  return 0;}

運行時的輸出如下:

num:10010name:Liage:17score:89

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

基類的構造函數首部:

  Student(int n, string nam)


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

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


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

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


注意不要寫成:

  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++類多級派生時的訪問屬性
在實際項目開發中,經常會有多級派生的情況。如圖11.9所示的派生關系:類A為基類,類B是類A 的派生類,類C是類B的派生類,則類C也是類A的派生類;類B稱為類A 的直接派生類,類C稱為類A的間接派生類;類A是類B的直接基類,是類 C的間接基類。

在多級派生的情況下,各成員的訪問屬性仍按以上原則確定。

為了把多重繼承說的更加詳細,請大家先看下面的幾個繼承的類。

[例] 如果聲明了以下的類:

class A //基類{public:  int i;protected:  void f2( );  int j;private:  int k;};class B: public A //public方式{public:  void f3( );protected:  void f4( );private:  int m;};class C: protected B //protected方式{public:  void f5( );private:  int n;};

類A是類B的公用基類,類B是類C的保護基類。各成員在不同類中的訪問屬性如下:

根據以上分析,在派生類C的外面只能訪問類C的成員函數f5,不能訪問其他成員。 派生類C的成員函數f5能訪問基類A的成員i、f2、j和派生類B的成員f3、f4。派生類B 的成員函數f3、f4能訪問基類A的成員i、f2和j。

通過以上分析,可以看到:無論哪一種繼承方式,在派生類中是不能訪問基類的私有成員的,私有成員只能被本類的成員函數所訪問,畢竟派生類與基類不是同一個類。

如果在多級派生時都采用公用繼承方式,那么直到最后一級派生類都能訪問基類的公用成員和保護成員。

如果采用私有繼承方式,經過若干次派生之后,基類的所有的成員已經變成不可訪問的了。

如果采用保護繼承方式,在派生類外是無法訪問派生類中的任何成員的。

而且經過多次派生后,人們很難清楚地記住哪些成員可以訪問,哪些成員不能訪問,很容易出錯。因此,在實際中,常用的是公用繼承。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 云南省| 泌阳县| 北流市| 安义县| 军事| 裕民县| 花垣县| 双鸭山市| 星子县| 南澳县| 铜鼓县| 江阴市| 徐闻县| 石河子市| 玉屏| 乐亭县| 东乡族自治县| 浦城县| 宽城| 龙泉市| 紫云| 平原县| 门头沟区| 双柏县| 伊宁县| 灵璧县| 昭通市| 行唐县| 兰西县| 卫辉市| 蕉岭县| 黄石市| 什邡市| 西宁市| 凯里市| 九江市| 郑州市| 滁州市| 济南市| 泸州市| 阿合奇县|