第章繼承與派生new-ppt課件_第1頁
第章繼承與派生new-ppt課件_第2頁
第章繼承與派生new-ppt課件_第3頁
第章繼承與派生new-ppt課件_第4頁
第章繼承與派生new-ppt課件_第5頁
已閱讀5頁,還剩119頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

1、電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT第第1111章章 承繼與派生承繼與派生第第1212章章 多態(tài)性與虛函數(shù)多態(tài)性與虛函數(shù)第第1313章章 輸入輸出流輸入輸出流第第1414章章 C+ C+工具工具第第4 4篇面向對象的程序設計篇面向對象的程序設計電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT第第1111章章 承繼與派生承繼與派生11.1 11.1 承繼與派生的概念承繼與派生的概念11.2 11.2 派生類的聲明方式派生類的聲明方式11.3

2、11.3 派生類的構成派生類的構成11.4 11.4 派生類成員的訪問屬性派生類成員的訪問屬性11.5 11.5 派生類的構造函數(shù)和析構函數(shù)派生類的構造函數(shù)和析構函數(shù)11.6 11.6 多重承繼多重承繼11.7 11.7 基類與派生類的轉換基類與派生類的轉換11.8 11.8 承繼與組合承繼與組合11.9 11.9 承繼在軟件開發(fā)中的重要意義承繼在軟件開發(fā)中的重要意義電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT面向對象程序設計有面向對象程序設計有4 4個主要特點個主要特點: : 籠統(tǒng)籠統(tǒng)封裝封裝承繼承繼多態(tài)性多態(tài)性面向

3、對象技術強調(diào)軟件的可重用性面向對象技術強調(diào)軟件的可重用性(software (software reusability) reusability) 。C+C+言語提供了類的承繼機制,處言語提供了類的承繼機制,處理了軟件重用問題。理了軟件重用問題。電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT在在C+C+中可重用性是經(jīng)過承繼中可重用性是經(jīng)過承繼(inheritance)(inheritance)這一這一機制來實現(xiàn)的。承繼是機制來實現(xiàn)的。承繼是C+C+的一個重要組成部分。的一個重要組成部分。在在C+C+中,所謂中,所謂“承繼

4、就是在一個已存在的類的承繼就是在一個已存在的類的根底上建立一個新的類。根底上建立一個新的類。見圖見圖11.111.1表示。表示。11.1 11.1 承繼與派生的概念承繼與派生的概念電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT已存在的類已存在的類( (例如例如“馬馬) )稱為稱為“基類基類(base class)(base class)或或“父類父類(father class)(father class)。新建立的類。新建立的類( (例如例如“公公馬馬) )稱為稱為“派生類派生類(derived class)(deriv

5、ed class)或或“子類子類(son (son class)class)。見圖。見圖11.211.2表示。表示。 圖11.1 圖11.2電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT一個派生類只從一個基類派生,這稱為單承繼一個派生類只從一個基類派生,這稱為單承繼(single inheritance)(single inheritance),這種承繼關系所構成的層,這種承繼關系所構成的層次是一個樹形構造,見以下圖。次是一個樹形構造,見以下圖。箭頭表示承繼的方向,從派生類指向基類。箭頭表示承繼的方向,從派生類指向基類。

6、電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT一個派生類不僅可以從一個基類派生,也可以從一個派生類不僅可以從一個基類派生,也可以從多個基類派生。一個派生類有兩個或多個基類的稱多個基類派生。一個派生類有兩個或多個基類的稱為多重承繼為多重承繼(multiple inheritance)(multiple inheritance)。電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT關于基類和派生類的關系:派生類是基類的詳細化,而基類那么是派生類的籠統(tǒng)。電子與

7、信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT聲明派生類的普通方式為:聲明派生類的普通方式為:class class 派生類名派生類名: : 承繼方式承繼方式 基類名基類名 派生類新添加的成員派生類新添加的成員 ; ;承繼方式包括承繼方式包括: public(: public(公用的公用的),private(),private(私有的私有的) )和和protected(protected(受維護的受維護的) ),假設不寫此項,那么默以,假設不寫此項,那么默以為為private(private(私有的私有的) )。11.2 11

8、.2 派生類的聲明方式派生類的聲明方式電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT派生類分為兩大部分派生類分為兩大部分: : 一部分是從基類承繼來的成員一部分是從基類承繼來的成員另一部分是在聲明派生類時添加的部分另一部分是在聲明派生類時添加的部分每一部分均分別包括數(shù)據(jù)成員和成員函數(shù)。每一部分均分別包括數(shù)據(jù)成員和成員函數(shù)。11.3 11.3 派生類的構成派生類的構成電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT編制編制派生派生類時類時可分可分四步四

9、步 吸收基類的成員吸收基類的成員 改造基類成員改造基類成員 開展新成員開展新成員 重寫構造函數(shù)與析構函數(shù)重寫構造函數(shù)與析構函數(shù) 不論是數(shù)據(jù)成員,還是函數(shù)成員,除不論是數(shù)據(jù)成員,還是函數(shù)成員,除構造函數(shù)與析構函數(shù)外全盤接納構造函數(shù)與析構函數(shù)外全盤接納 聲明一個和某基類成員同名的新成員,派聲明一個和某基類成員同名的新成員,派生類中的新成員就屏蔽了基類同名成員稱生類中的新成員就屏蔽了基類同名成員稱為同名覆蓋為同名覆蓋override 派生類新成員必需與基類成員不同名,它的派生類新成員必需與基類成員不同名,它的參與保證派生類在功能上有所開展。參與保證派生類在功能上有所開展。 構造一個派生類包括以下構造

10、一個派生類包括以下4 4部分任務部分任務: :電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT派生類對象構造派生類對象構造 對于下面的承繼關系:對于下面的承繼關系:class Father int a,b;public:/ 成員函數(shù)成員函數(shù);class Son:public Father int c;public: / 成員函數(shù)成員函數(shù);基類對象子類對象子類對象空間總是不小于基類對象cabab基類部分基類部分子類添加部分子類添加部分電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOL

11、OGY DEPARTMENT11.4 11.4 派生類成員的訪問屬性派生類成員的訪問屬性承繼可以公有承繼,維護承繼和私有承繼。承繼可以公有承繼,維護承繼和私有承繼。公有承繼是普通承繼,基類可以為大多數(shù)運用效力。公有承繼是普通承繼,基類可以為大多數(shù)運用效力。也可以反復承繼。也可以反復承繼。維護承繼是維護承繼是“單傳承繼,只承繼給本人的后代,單傳承繼,只承繼給本人的后代,運用是以子孫的公有成員函數(shù)來對外展開效力的。運用是以子孫的公有成員函數(shù)來對外展開效力的。私有承繼是私有承繼是“絕版承繼,該基類只承繼直接的子絕版承繼,該基類只承繼直接的子類,而不思索讓子類再承繼下去。類,而不思索讓子類再承繼下去。

12、電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTpublicpublic承繼:承繼:基類的基類的publicpublic成員成員, , 在派生類中成為在派生類中成為publicpublic成員成員基類的基類的protectedprotected成員成員, , 在派生類中成為在派生類中成為protected protected 成員成員基類的基類的privateprivate成員成員, , 在派生類中成為不可直接運用的成員在派生類中成為不可直接運用的成員11.4.1 11.4.1 公有承繼公有承繼 公有基類的成員公有基類的成

13、員私有成員私有成員公有成員公有成員 保護成員保護成員在公有派生類中的訪問屬性在公有派生類中的訪問屬性不可訪問不可訪問公有公有保護保護表表11.1公用基類在派生類中的訪問屬性公用基類在派生類中的訪問屬性電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT例:下面定義了兩個具例:下面定義了兩個具有單承繼關系的類有單承繼關系的類A和和B,其中,其中,A為基類,為基類,B為派生類:為派生類:class Aint x,y;public:void f();void g();class B : public Aint z;public:vo

14、id h();電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT在在C+C+中對派生類有以下幾點規(guī)定:中對派生類有以下幾點規(guī)定:派生類除了擁有基類的一切成員基類的構造函數(shù)和派生類除了擁有基類的一切成員基類的構造函數(shù)和賦值操作符重載函數(shù)除外外,也可以具有新的成員。賦值操作符重載函數(shù)除外外,也可以具有新的成員。class Aint x,y;public:void f();void g();class B : public Aint z;public:void h();void main()B b;b.f( ); /A類中的類中的

15、 fb.g( ); /A類中的類中的gb.h( ); /B類中的類中的h電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTu派生類的定義用于描畫派生類與基類的差別。派生派生類的定義用于描畫派生類與基類的差別。派生類中可以給出新的成員,也可以對基類的成員進展重類中可以給出新的成員,也可以對基類的成員進展重定義。假設在派生類中對基類的某個成員進展重定義,定義。假設在派生類中對基類的某個成員進展重定義,那么在派生類中對該成員的訪問是針對派生類中重定那么在派生類中對該成員的訪問是針對派生類中重定義的成員。義的成員。class B :

16、 public Aint z;public:void f();void h() f( ); /B類中的類中的f g( ); /A類中的類中的g;void main( )B b;b.f( ); /B類中的類中的 fb.g ( ); /A類中的類中的gb.h( ); /B類中的類中的h電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTu派生類成員名的作用域嵌套在基類的作用域中,對派生類成員名的作用域嵌套在基類的作用域中,對于基類的一個成員,假設派生類中沒有定義與其同名于基類的一個成員,假設派生類中沒有定義與其同名的成員,那么該成

17、員名在派生類的作用域內(nèi)可見,否的成員,那么該成員名在派生類的作用域內(nèi)可見,否那么,該成員名在派生類的作用域內(nèi)不直接可見,假那么,該成員名在派生類的作用域內(nèi)不直接可見,假設要運用,必需用基類名受限。例:設要運用,必需用基類名受限。例:class B : public Aint z;public:void f( );void h( ) f( ); /B類中的類中的f A:f( ) /A類中的類中的f;void main( )B b;b.f( ); / B 類中的類中的 fb.A:f( ); /A類中的類中的f電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNO

18、LOGY DEPARTMENTu即使派生類中定義了與基類同名但參數(shù)不同的成員即使派生類中定義了與基類同名但參數(shù)不同的成員函數(shù),基類的同名函數(shù)在派生類中的作用域中也是不函數(shù),基類的同名函數(shù)在派生類中的作用域中也是不直接可見的。例:直接可見的。例:class B : public Aint z;public:void f(int);void h( ) f(1); /Ok f( ); / A:f( ) / Ok;void main( )B b;b.f(1); / Okb.f( ); / b.A:f( ); / Ok電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECH

19、NOLOGY DEPARTMENTu定義派生類時一定要見到基類的定義,否那么編譯定義派生類時一定要見到基類的定義,否那么編譯程序無法確定派生類對象需占多大內(nèi)存空間以及派生程序無法確定派生類對象需占多大內(nèi)存空間以及派生類中對基類成員的訪問能否合法。例:類中對基類成員的訪問能否合法。例:class A;class B : public Aint z;public:void h( ) g( ); /Error沒有沒有g的原型的原型;B b; / Error無法確定無法確定 b 所需空間所需空間電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPA

20、RTMENTu假設在派生類中沒有顯式闡明,基類的友元不是派假設在派生類中沒有顯式闡明,基類的友元不是派生類的友元;假設基類是另一個類的友元,而該類沒生類的友元;假設基類是另一個類的友元,而該類沒有顯式闡明,那么派生類也不是該類的友元。有顯式闡明,那么派生類也不是該類的友元。u派生類不能直接訪問基類的私有成員,必需求經(jīng)過派生類不能直接訪問基類的私有成員,必需求經(jīng)過基類的非私有成員函數(shù)來訪問基類的私有成員。例:基類的非私有成員函數(shù)來訪問基類的私有成員。例:class A int x,y; public: void f( ); void g( )x;class B : public Aint z;p

21、ublic:void h( )x /Error, x為基類的私有成員為基類的私有成員g( ); /Ok, 經(jīng)過函數(shù)經(jīng)過函數(shù)g訪問基類的私有成員訪問基類的私有成員x;電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT在派生類中對基類成員的訪問在派生類中對基類成員的訪問一個類有兩種用戶:實例用戶和派生類。例:一個類有兩種用戶:實例用戶和派生類。例:一個類存在兩個對外接口一個類存在兩個對外接口給實例用戶運用:由類的給實例用戶運用:由類的publicpublic成員構成成員構成提供應派生類運用:由類的提供應派生類運用:由類的publ

22、icpublic和和protectedprotected成員成員構成構成class A ;class B : public A /派生類派生類; void f( )/實例用戶實例用戶 A a;class A protected:int x,y; public:void f( );class B : public A /派生類派生類 void h() x / Ok y / Ok f( ); / Ok; void f( )/實例用戶實例用戶 A a;a.x / Errora.y / Errora.f( ); / Ok;電子與信息工程系電子與信息工程系COMPUTER SCIENCE & T

23、ECHNOLOGY DEPARTMENTu類的聚集:一個類只需一個接口,即類的實例用戶類的聚集:一個類只需一個接口,即類的實例用戶接口。例:以承繼和聚集實現(xiàn)的代碼重用。接口。例:以承繼和聚集實現(xiàn)的代碼重用。class A public :void f();void g();class B : public A public :void h(); class B A a;public :void f()a.f();void g()a.g();void h();電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTu承繼實現(xiàn)子類型,

24、派生類可以看成基類的子類型。承繼實現(xiàn)子類型,派生類可以看成基類的子類型。u子類型的作用:發(fā)給基類對象的音訊也能發(fā)給派生子類型的作用:發(fā)給基類對象的音訊也能發(fā)給派生類對象,以及基類的對象標識可以標識派生類對象。類對象,以及基類的對象標識可以標識派生類對象。class A public :void f();class B : public A public :void g(); 以下操作合法:以下操作合法:A a,*p;B b,*q;b.f();a=b;p=&b;以下操作非法:以下操作非法:b=a; /Error b有不確定的成員數(shù)據(jù)有不確定的成員數(shù)據(jù)q=&a; /Error用用b

25、去改動去改動a的形狀,屬于的形狀,屬于b但不屬于但不屬于a的成員將被忽略的成員將被忽略A類指針類指針p指向指向B類對象類對象b電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT例例11.1 訪問公有基類的成員。訪問公有基類的成員。Class Student/聲明基類聲明基類public: /基類公用成員基類公用成員 void get_value( ) cinnumnamesex; void display( ) cout num: numendl; cout name: nameendl; cout sex: sexendl

26、; private : /基類私有成員基類私有成員 int num; char name8; char sex; class Student1: public Student /以以public方式聲明派生類方式聲明派生類Student1電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT public:void display_1( )cout num: numendl; cout name: nameendl; /援用基類的私有成員,錯誤援用基類的私有成員,錯誤 cout sex: sexendl; cout age: a

27、geendl; /援用派生類的私有成員,正確援用派生類的私有成員,正確 cout address: addrendl; /援用派生類私有成員,正確援用派生類私有成員,正確private: int age; char addr12; ;結論:結論:由于基類的私有成員對派生類來說是不可訪問的,由于基類的私有成員對派生類來說是不可訪問的,因此在派生類中的因此在派生類中的display_1display_1函數(shù)中直接援用基類函數(shù)中直接援用基類的私有數(shù)據(jù)成員的私有數(shù)據(jù)成員numnum,namename和和sexsex是不允許的。是不允許的。只能經(jīng)過基類的公用成員函數(shù)來援用基類的私有數(shù)只能經(jīng)過基類的公用成

28、員函數(shù)來援用基類的私有數(shù)據(jù)成員。據(jù)成員。電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT可以將派生類可以將派生類Student1的聲明改為:的聲明改為:class Student1: public Student /以以public方式聲明派生類方式聲明派生類Student1public:void display_1( ) cout age: ageendl; /派生類的私有成員,正確派生類的私有成員,正確cout address: addrageaddr;private:int age; string addr;電子與信

29、息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT可以這樣寫可以這樣寫main函數(shù)函數(shù): int main( )Student1 stud; stud. get_value ( );stud. get_value_1 ( );stud.display( ); stud.display_1(); return 0; void display_1( ) display( ) ;cout“ age: “ageendl; cout“ address: “addrageaddr;電子與信息工程系電子與信息工程系COMPUTER SCIENCE

30、 & TECHNOLOGY DEPARTMENTprivateprivate承繼:承繼:基類的基類的publicpublic成員成員, , 在派生類中成為在派生類中成為private private 成員成員基類的基類的protectedprotected成員成員, , 在派生類中成為在派生類中成為privateprivate成員成員基類的基類的privateprivate成員成員, , 在派生類中成為不可直接運用的成員在派生類中成為不可直接運用的成員11.4.2 11.4.2 私有承繼私有承繼 私有基類的成員私有基類的成員私有成員私有成員公有成員公有成員 保護成員保護成員在私有派生類

31、中的訪問屬性在私有派生類中的訪問屬性不可訪問不可訪問私有私有私有私有表表11.1私有基類在派生類中的訪問屬性私有基類在派生類中的訪問屬性電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT圖11.7表示了各成員在派生類中的訪問屬性。電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT例例11.2 11.2 將例將例11.111.1中的公用承繼方式改為用私有承繼方中的公用承繼方式改為用私有承繼方式式( (基類基類StudentStudent不改不改) )。可以寫

32、出私有派生類如下可以寫出私有派生類如下: :class Student1: private Student/class Student1: private Student/用私有承繼方式用私有承繼方式聲明聲明public:public:void display_1( ) void display_1( ) coutcout“age: age: “ageendl; ageendl; coutcout“address: address: “addrendl;addrendl; private:private:int age; int age; char addr12;char addr12;int

33、 main( )Student1 stud1; stud1.display(); /錯誤錯誤stud1.display_1( ); /正確正確stud1.age=18; /錯誤錯誤return 0; 電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT結論結論: : (1) (1) 不能經(jīng)過派生類對象不能經(jīng)過派生類對象( (如如stud1)stud1)援用從援用從私有基類承繼過來的任何成員。私有基類承繼過來的任何成員。(2) (2) 派生類的成員函數(shù)不能訪問私有基類的派生類的成員函數(shù)不能訪問私有基類的私有成員,但可以訪問私有基

34、類的公用成員。私有成員,但可以訪問私有基類的公用成員。 在派生類外不能經(jīng)過派生類對象調(diào)用私在派生類外不能經(jīng)過派生類對象調(diào)用私有基類的公用成員函數(shù),但可以經(jīng)過派生類有基類的公用成員函數(shù),但可以經(jīng)過派生類的成員函數(shù)調(diào)用私有基類的公用成員函數(shù)的成員函數(shù)調(diào)用私有基類的公用成員函數(shù)( (此時它是派生類中的私有成員函數(shù),可以此時它是派生類中的私有成員函數(shù),可以被派生類的任何成員函數(shù)調(diào)用被派生類的任何成員函數(shù)調(diào)用) )。電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT可將上面的私有派生類的成員函數(shù)定義改寫為可將上面的私有派生類的成員函數(shù)

35、定義改寫為void display_1( )display(); /調(diào)用基類的公用成員函數(shù)調(diào)用基類的公用成員函數(shù) coutage: ageendl; /派生類的私有數(shù)據(jù)成員派生類的私有數(shù)據(jù)成員coutaddress: addrendl; /派生類的私有數(shù)據(jù)成員派生類的私有數(shù)據(jù)成員main函數(shù)可改寫為函數(shù)可改寫為int main( )Student1 stud1; stud1.display_1( ); /Student1類的公用函數(shù)類的公用函數(shù) return 0;電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT由于私有派生

36、類限制太多,運用不方便,普通不常運用。電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT11.4.3 11.4.3 維護成員和維護承繼維護成員和維護承繼protected protected 承繼:承繼:基類的基類的publicpublic成員成員, , 在派生類中成為在派生類中成為protected protected 成員成員基類的基類的protectedprotected成員成員, , 在派生類中成為在派生類中成為protected protected 成員成員基類的基類的privateprivate成員成員, , 在

37、派生類中成為不可直接運用的成員在派生類中成為不可直接運用的成員基類中的成員基類中的成員 在公有派生類在公有派生類在私有派生類在私有派生類在保護派生類在保護派生類私有成員私有成員不可訪問不可訪問不可訪問不可訪問不可訪問不可訪問公有成員公有成員公有公有私有私有保護保護保護成員保護成員保護保護私有私有保護保護表表11.3基類成員在派生類中的訪問屬性基類成員在派生類中的訪問屬性電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT維護成員可以被派生類的成員函數(shù)援用。但不能被維護成員可以被派生類的成員函數(shù)援用。但不能被實例函數(shù)援用。實例函

38、數(shù)援用。電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT例:例:class B1 int a; void f( )couta; public: int b; void g( )couta; protected: int c; void k( )couta; ;對派生類:對派生類:class B2: public B1public: void df( ) couta; / coutb; coutc; f( ); / g( ); k( ); ;對實例函數(shù)對實例函數(shù)void main( ) B1 b1; coutb1.a;/ c

39、outb1.b; coutb1.c; / b1.f( ); / b1.g( ); b1.k( ); / 電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT(1) (1) 在派生類中,成員有在派生類中,成員有4 4種不同的訪問屬性種不同的訪問屬性: : 派生類中的成員派生類中的成員在派生類中在派生類中 在派生類外在派生類外在下層公用派生類中在下層公用派生類中公用的成員公用的成員可以可以可以可以可以可以受保護的成員受保護的成員可以可以不可以不可以可以可以私有的成員私有的成員可以可以不可以不可以不可以不可以不可訪問的成員不可訪問的

40、成員不可以不可以不可以不可以不可以不可以表表11.411.4派生類中的成員的訪問屬性派生類中的成員的訪問屬性電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT例例11.3 在派生類中援用維護成員。在派生類中援用維護成員。#include #include using namespace std;class Studentpublic: void display( ); protected :int num;string name;char sex;void Student:display( ) coutnum: numend

41、l; coutname: nameendl; coutsex: sexendl; class Student1: protected Studentpublic:void display1( ); private:int age; char addr 12; ;電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTvoid Student1:display1( ) /定義派生類公用成員函數(shù)定義派生類公用成員函數(shù) coutnum: numendl; /基類的維護成員,合法基類的維護成員,合法 coutname: nameendl;

42、 coutsex: sexendl; coutage: ageendl; /派生類的私有成員,合法派生類的私有成員,合法 coutaddress: addrendl; int main( ) Student1 stud1; stud1.display1( ); stud1.num=10023; / 錯誤,外界不能訪問維護成員錯誤,外界不能訪問維護成員return 0; 電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT在派生類的成員函數(shù)中援用基類的維護成員是合法的。維護成員和私有成員不同之處,在于把維護成員的訪問范圍擴展到派

43、生類中。留意: 在程序中經(jīng)過派生類Student1的對象stud1的公用成員函數(shù)display1去訪問基類的維護成員和sex,不要誤以為可以經(jīng)過派生類對象名去訪問基類的維護成員。私有承繼和維護承繼方式很容易搞錯,普通不常用。電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT 11.4.4 11.4.4 多級派生時的訪問屬性多級派生時的訪問屬性圖11.9假設有圖11.9所示的派生關系: 類A為基類,類B是類A的派生類,類C是類B的派生類,那么類C也是類A的派生類。類B稱為類A的直接派生類,類C稱為類A的間接派生

44、類。類A是類B的直接基類,是類C的間接基類。在多級派生的情況下,各成員的訪問屬性仍按以上原那么確定。電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT例例11.4 多級派生訪問屬性。多級派生訪問屬性。class Apublic: int i; protected: void f2( ); int j; private: int k;class B: public A public:void f3( ); protected:void f4( ); private: int m;class C: protected Bpubl

45、ic:void f5( ); private: int n;class B:public: void f3( ); int i;protected: void f4( ); void f2( ); int j;private: int m;class C:public: void f5( );protected: void f4( ); void f2( ); int j; void f3( ); int i;private: int n;電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTu在派生類中是不能訪問基類的私有成員

46、的,私有成員只能被本類的成員函數(shù)所訪問,畢竟派生類與基類不是同一個類。u在多級派生時:u采用公用承繼方式,那么直到最后一級派生類都能訪問基類的公用成員和維護成員。u采用私有承繼方式,經(jīng)過假設干次派生之后,基類的一切的成員曾經(jīng)變成不可訪問的了。u采用維護承繼方式,在派生類外是無法訪問派生類中的任何成員的。經(jīng)過多次派生后,很難記住哪些成員可以訪問,哪些成員不能訪問。常用的是公用承繼常用的是公用承繼!電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT11.5 11.5 派生類的構造函數(shù)和析構函數(shù)派生類的構造函數(shù)和析構函數(shù)用戶在聲明

47、類時可以不定義構造函數(shù),系統(tǒng)會自用戶在聲明類時可以不定義構造函數(shù),系統(tǒng)會自動設置一個默許的構造函數(shù)。動設置一個默許的構造函數(shù)。在設計派生類的構造函數(shù)時,希望在執(zhí)行派生類在設計派生類的構造函數(shù)時,希望在執(zhí)行派生類的構造函數(shù)時,使派生類的數(shù)據(jù)成員和基類的數(shù)據(jù)的構造函數(shù)時,使派生類的數(shù)據(jù)成員和基類的數(shù)據(jù)成員同時都被初始化。成員同時都被初始化。處理這個問題的思緒是處理這個問題的思緒是: 在執(zhí)行派生類的構造函數(shù)在執(zhí)行派生類的構造函數(shù)時,調(diào)用基類的構造函數(shù)。時,調(diào)用基類的構造函數(shù)。電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT例例1

48、1.5 簡單的派生類的構造函數(shù)。簡單的派生類的構造函數(shù)。#include #includeusing namespace std;class Student/聲明基類聲明基類Student public: Student(int n,string nam,char s) /基類構造函數(shù)基類構造函數(shù) num=n; name=nam; sex=s; Student( ) /基類析構函數(shù)基類析構函數(shù)protected: /維護部分維護部分 int num; string name; char sex ; ;11.5.1 11.5.1 簡單的派生類的構造函數(shù)簡單的派生類的構造函數(shù)電子與信息工程系電子與

49、信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTclass Student1: public Student public: Student1(int n,string nam, char s, int a,string ad): Student(n,nam,s) age=a; addr=ad; void show( ) coutnum: numendl; coutname: nameendl; coutsex: sexendl; coutage: ageendl; coutaddress: addrendl; Student1( ) priv

50、ate:調(diào)用基類構造函數(shù)調(diào)用基類構造函數(shù)派生類新增的數(shù)據(jù)派生類新增的數(shù)據(jù)成員初始化成員初始化電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT int age; string addr; ;int main( ) Student1 stud1(10010,Wang-li,f,19,115 Beijing Road,Shanghai); Student1 stud2(10011,Zhang-fun,m,21,213 Shanghai Road,Beijing); stud1.show( ); stud2.show( ); re

51、turn 0;運轉結果為運轉結果為num: 10010name: Wang-lisex: fage: 19address: 115 Beijing Road,Shanghainum: 10011name: Zhang-funsex: mage: 21address: 213 Shanghai Road,Beijing電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT派生類構造函數(shù)的普通方式為派生類構造函數(shù)的普通方式為:派生類構造函數(shù)名派生類構造函數(shù)名(總參數(shù)表列總參數(shù)表列):基類構造函數(shù)名基類構造函數(shù)名(參數(shù)表列參數(shù)表列)

52、派生類中新增數(shù)據(jù)成員初始化語句派生類中新增數(shù)據(jù)成員初始化語句例如:例如:電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT派生類構造函數(shù)在類外定義,而在類體中函數(shù)的聲派生類構造函數(shù)在類外定義,而在類體中函數(shù)的聲明明: : Student1(int nStudent1(int n,string namstring nam,char schar s,int aint a,string ad);string ad);在類的外面定義派生類構造函數(shù)在類的外面定義派生類構造函數(shù): : Student1Student1(int n,str

53、ing nam,char Student1Student1(int n,string nam,char s,int as,int a,string ad):Student(nstring ad):Student(n,namnam,s)s) age=a; addr=ad; age=a; addr=ad;電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT留意留意: : 在類中對派生類構造函數(shù)聲明時,不包括基類構造在類中對派生類構造函數(shù)聲明時,不包括基類構造函數(shù)名及其參數(shù)表列即函數(shù)名及其參數(shù)表列即Student(nStudent(

54、n,namnam,s)s)。調(diào)用基類構造函數(shù)時的實參是從派生類構造函數(shù)總調(diào)用基類構造函數(shù)時的實參是從派生類構造函數(shù)總參數(shù)表中得到的,也可以不從派生類構造函數(shù)總參參數(shù)表中得到的,也可以不從派生類構造函數(shù)總參數(shù)表中傳送過來,而直接運用常量或全局變量。數(shù)表中傳送過來,而直接運用常量或全局變量。例例: : Student1(string namStudent1(string nam,char schar s,int aint a,string string ad)ad):Student(10010Student(10010,namnam,s) age=a; addr=ad;s) age=a; addr

55、=ad;常量常量電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTu利用初始化表對構造函數(shù)的數(shù)據(jù)成員初始化利用初始化表對構造函數(shù)的數(shù)據(jù)成員初始化u Student1(int n, string nam,char s,int a, Student1(int n, string nam,char s,int a, string ad):string ad):u Student(n,nam,s),age(a),addr(ad) Student(n,nam,s),age(a),addr(ad)u在建立一個派生類對象時,執(zhí)行構造函數(shù)的

56、順序是在建立一個派生類對象時,執(zhí)行構造函數(shù)的順序是: : u派生類構造函數(shù)先調(diào)用基類構造函數(shù);派生類構造函數(shù)先調(diào)用基類構造函數(shù);u再執(zhí)行派生類構造函數(shù)本身再執(zhí)行派生類構造函數(shù)本身( (即派生類構造函數(shù)的函即派生類構造函數(shù)的函數(shù)體數(shù)體) )。u在派生類對象釋放時,執(zhí)行析構函數(shù)的順序是在派生類對象釋放時,執(zhí)行析構函數(shù)的順序是: : u先執(zhí)行派生類析構函數(shù);先執(zhí)行派生類析構函數(shù);u再執(zhí)行其基類析構函數(shù)。再執(zhí)行其基類析構函數(shù)。電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT類的數(shù)據(jù)成員中還可以包含類對象。類的數(shù)據(jù)成員中還可以包含類

57、對象。例例: : Student s1; / s1Student s1; / s1是是StudentStudent類的對象類的對象s1s1就是類對象中的內(nèi)嵌對象,稱為子對象就是類對象中的內(nèi)嵌對象,稱為子對象(subobject)(subobject),即對象中的對象。,即對象中的對象。11.5.2 11.5.2 有子對象的派生類的構造函數(shù)有子對象的派生類的構造函數(shù)電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT例例11.6 包含子對象的派生類的構造函數(shù)。包含子對象的派生類的構造函數(shù)。#include #include us

58、ing namespace std;class Student public: Student(int n, string nam ) num=n; name=nam; void display( ) coutnum:numendlname:nameendl;protected: int num; string name;class Student1: public Student電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT public: Student1(int n, string nam,int n1, stri

59、ng nam1,int a, string ad):Student(n,nam),monitor(n1,nam1) age=a; addr=ad; void show( ) coutThis student is:endl; display(); coutage: ageendl; coutaddress: addrendl; void show_monitor( ) coutendlClass monitor is:endl; monitor.display( ); /調(diào)用基類成員函數(shù)調(diào)用基類成員函數(shù) 基類參數(shù)基類參數(shù)子類參數(shù)子類參數(shù)派生類參數(shù)派生類參數(shù)1、基類構造函數(shù)、基類構造函數(shù)2、子類

60、構造函數(shù)、子類構造函數(shù)3、派生類構造函數(shù)、派生類構造函數(shù)電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENTprivate: Student monitor; /定義子對象定義子對象(班長班長) int age; string addr; ;int main( )Student1 stud1(10010,Wang-li,10001,Li-sun,19,115 Beijing Road,Shanghai); stud1.show( ); stud1.show_monitor(); /輸出子對象的數(shù)據(jù)輸出子對象的數(shù)據(jù)return 0;運轉時的輸出如下運轉時的輸出如下: This student is:num: 10010name: Wang-liage: 19address:115 Beijing Road,Shanghai Class monitor is:num:10001name:Li-sun電子與信息工程系電子與信息工程系COMPUTER SCIENCE & TECHNOLOGY DEPARTMENT定義派生類構造函數(shù)的普通方式為:定義派生類構造函數(shù)的普通方式為:派生類構造

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論