實(shí)驗(yàn)五 類的繼承與派生_第1頁(yè)
實(shí)驗(yàn)五 類的繼承與派生_第2頁(yè)
實(shí)驗(yàn)五 類的繼承與派生_第3頁(yè)
實(shí)驗(yàn)五 類的繼承與派生_第4頁(yè)
實(shí)驗(yàn)五 類的繼承與派生_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第一節(jié) 類的繼承與派生一、基本概念繼承是面向?qū)ο蟪绦蛟O(shè)計(jì)的一個(gè)特性,所謂繼承就是在已有類的基礎(chǔ)上創(chuàng)建新的類,新類可以從一個(gè)或多個(gè)已有類中繼承成員函數(shù)或數(shù)據(jù)成員,而且新類還可以重新定義或加進(jìn)新的數(shù)據(jù)和函數(shù)。其中,已有類稱為基類或父類,新類稱為派生類或子類。在現(xiàn)實(shí)世界中許多事物都具有繼承性。例如:“汽車(chē)”這個(gè)類中包括了許多類型,有運(yùn)輸汽車(chē)、專用汽車(chē);運(yùn)輸汽車(chē)中又包括客車(chē)、貨車(chē).;專用汽車(chē)中又包括巡邏車(chē)、消防車(chē)、救護(hù)車(chē).;所有這些類型的車(chē)都具有汽車(chē)的共同特性即都有發(fā)動(dòng)機(jī)、車(chē)身、輪胎等共性,還都是自行驅(qū)動(dòng)的。而客車(chē)和貨車(chē)又有所不同,客車(chē)用來(lái)載客,貨車(chē)用來(lái)拉貨,它們有自己不同于其它車(chē)的特性,這就是繼承。

2、我們把汽車(chē)稱為基類,把運(yùn)輸汽車(chē)、客車(chē)、貨車(chē)稱為派生類。通過(guò)繼承,派生類不僅擁有了基類的屬性和行為,而且具有不同于它類的自己的特點(diǎn)。二、派生類的定義與構(gòu)成當(dāng)你去水果店買(mǎi)水果的時(shí)候,你經(jīng)常會(huì)發(fā)現(xiàn)很多同類水果又有了新的品種。比如,“李子”既小又澀,嫁接在梨樹(shù)上后長(zhǎng)出來(lái)的李子卻碩大、香甜、清脆,比沒(méi)有嫁接的李子好吃,但它還是李子家族中的一員;所以,可以認(rèn)為“嫁接李子”是從“李子”中派生出來(lái)的。當(dāng)然,可以把“李子”嫁接在梨樹(shù)上,也可以嫁接在蘋(píng)果樹(shù)上,結(jié)出來(lái)的都是“李子”,但是各自味道不同。所謂派生 就是從已有類中產(chǎn)生一個(gè)新的子類。基類 就是已存在的可以派生新類的類,如下圖中的A、D、E都是基類。派生類

3、就是由基類派生出來(lái)的新類,如下圖中的B、C、F都是派生類。 1. 單繼承派生類的定義格式 class <派生類名> : <繼承方式> <基類名> 派生類成員的定義;其中,“派生類名”是新定義的一個(gè)類的名字,它是從“基類名”中派生的,并且按指定的“繼承方式”派生。例如: class peach / 基類 datatype color , shape ; ;class sweetpeach :public peach / 單繼承 datatype color , shape, taste ; ; sweetpeach類只是繼承自peach類,即swee

4、tpeach類只有一個(gè)基類,這就是單繼承。2. 多繼承派生類的定義格式 class <派生類名> :<繼承方式1> <基類名>,<繼承方式2> <基類名>, . 派生類成員的定義;;多繼承與單繼承在定義格式的區(qū)別僅在于它們的基類個(gè)數(shù)不同,單繼承的基類只有一個(gè),而多繼承的基類有多個(gè),相鄰兩個(gè)基類之間用逗號(hào)間隔,每個(gè)基類名前都應(yīng)有一個(gè)該基類的繼承方式的說(shuō)明符。例如: class peach /定義基類:peach datatype color , shape ; ; class apple /定義基類:peach datatyp

5、e color, shape , weight ; class sweetpeach : public peach, public apple / 多繼承 datatype color, shape, taste;類sweetpeach 同時(shí)繼承自類peach 和類apple,這就是多繼承。3繼承的作用有的讀者可能會(huì)問(wèn)為什么要有繼承,繼承有什么好處,繼承的作用是什么?為了解決這些疑問(wèn),我們一起來(lái)分析以下例子,從中領(lǐng)悟繼承的奧妙。【例10-1-1】 分析以下代碼。聲明一個(gè)person 類,它包含的成員有name(姓名)、 age(年齡)、 gender(性別),和output函數(shù),具體

6、定義如下:class person public : char name8 ; int age; char gender ; public : void output() ; 現(xiàn)在要聲明一個(gè)student類,它包含的成員有name(姓名),age(年齡),gender(性別), department(系),stuno(學(xué)號(hào)), address(住址),和output函數(shù),具體定義如下: class student public : char name8 ; int age; char gender; char department20 ; int stuno; int ad

7、dress; public : void output() ; 從這兩個(gè)類的聲明中可以看出,它們中有些成員數(shù)據(jù)和成員函數(shù)是相同的。這樣就存在代碼的重復(fù),為了提高代碼的可重用性,就引入了繼承。即,如果 student類以共有繼承的方式繼承person類,那么student類就可以直接使用person類中的共有成員如name, gander,age和output() 函數(shù),這樣在student類中就不需要再定義與person類中相同的變量了,只定義person類中沒(méi)有的在student類中需要的變量。具體實(shí)現(xiàn)如下: class student : public person /

8、 student共有繼承person類 public : char department20 ; int stuno ; int address ; public : void output() ;提示Ø   student 類稱為派生類,person類成為基類;Ø   關(guān)鍵字public 的作用是說(shuō)明派生類公有繼承了基類中的所有成員,即派生類可以直接訪問(wèn)基類的成員;Ø   繼承可以使代碼得以重用,提高工作效率。三、派生類訪問(wèn)基類成員通過(guò)前面的學(xué)習(xí)大家都知道基類的成員有public(公有)、protected(保護(hù))、private(

9、私有)3種訪問(wèn)屬性,基類的自身成員可以對(duì)基類中任何一個(gè)其他成員進(jìn)行訪問(wèn),但是通過(guò)基類的對(duì)象就只能訪問(wèn)該類的公有成員。派生類可以繼承基類中除了構(gòu)造函數(shù)和析構(gòu)函數(shù)之外的全部成員,但是這些成員的訪問(wèn)屬性在派生過(guò)程中是可以調(diào)整的。從基類繼承來(lái)的成員在派生類中的訪問(wèn)屬性是由繼承方式控制的。不同的繼承方式導(dǎo)致原來(lái)具有不同的訪問(wèn)屬性的基類成員在派生類的訪問(wèn)屬性也有所不同。在派生類中,從基類繼承來(lái)的成員可以訪問(wèn)屬性有4種:不可直接訪問(wèn)的成員、public(公有成員)、protected(保護(hù)成員)、private(私有成員)。1三種繼承方式的聲明 public 公有繼承公有繼承:在定義一個(gè)派生類時(shí)將基類的繼承

10、方式指定為public 的繼承方式。例如: class student : public person private 私有繼承私有繼承:在定義一個(gè)派生類時(shí)將基類的繼承方式指定為private的繼承方式。例如: class student : private person protected 保護(hù)繼承保護(hù)繼承:在定義一個(gè)派生類時(shí)將基類的繼承方式指定為protected的繼承方式。例如: class student : protected person 2三種繼承方式的區(qū)別如表1指明了三種繼承方式的區(qū)別,即派生類對(duì)基類成員的訪問(wèn)能力。表 1 三種繼承方式的區(qū)別在基類中的訪問(wèn)屬性繼承方式在派生類中

11、的訪問(wèn)屬性privatepublic不可直接訪問(wèn)privateprivate不可直接訪問(wèn)privateprotected不可直接訪問(wèn)publicpublicpublicpublicprivateprivatepublicprotectedprotectedprotectedpublicprotectedprotectedprivateprivateprotectedprotectedprotected提示Ø   在任何繼承方式中基類中的私有成員都不允許派生類繼承,即在派生類中是不可直接訪問(wèn)基類中的私有成員。Ø   當(dāng)類的繼承方式為公有繼承時(shí):基類中的所有

12、公有成員在派生類中仍為公有成員;基類中的所有保護(hù)成員在派生類中仍為保護(hù)成員。Ø   當(dāng)類的繼承方式為私有繼承時(shí):基類中的所有公有成員在派生類中都為私有成員;基類中的所有保護(hù)成員在派生類中都為私有成員。Ø   當(dāng)類的繼承方式為保護(hù)繼承時(shí):基類中的所有公有成員在派生類中都為保護(hù)成員;基類中的所有保護(hù)成員在派生類中仍為保護(hù)成員。 派生類對(duì)基類成員的訪問(wèn)形式主要有以下兩種:(1) 內(nèi)部訪問(wèn):由派生類中的新增成員對(duì)從基類繼承來(lái)的成員的訪問(wèn)。(2) 對(duì)象訪問(wèn):在派生類外部,通過(guò)派生類的對(duì)象對(duì)從基類繼承的成員的訪問(wèn)。現(xiàn)在分別討論在公有繼承、私有繼承、保護(hù)繼承

13、這3種繼承方式下,派生類對(duì)基類成員的訪問(wèn)規(guī)則。一、公有繼承【例1】分析以下程序。源代碼:#include <iostream.h>#include <stdlib.h>class Base private: int pvx; /pvx為基類私有變量 protected : int pty; /pty為基類保護(hù)變量 public : float puf; /puf為基類公有變量 void Setxy(int q, int u, float w) /Setxy()為基類公有函數(shù) pvx = q ; pty = u; puf = w; void Output() /Outpu

14、t()為基類公有函數(shù) cout << "class Base output "<< endl; cout << "pvx= " << pvx << endl; cout << "pty= " << pty << endl; cout << "puf= " << puf << endl; ;class Derive : public Base /公有單繼承 private : float

15、 pvz; public : void Setvalue(int x, int y, float f, float z) Setxy(x, y, f); pvx = x; /非法訪問(wèn),基類中的pvx為private屬性,不能被繼承 pty = y; /合法訪問(wèn) puf = f; /合法訪問(wèn) pvz = z; void Print() cout << "pvx= " << pvx << endl;/ 非法訪問(wèn),在基類中pvx為私有成員 cout << "class Derive output " <&l

16、t; endl; cout << "pty= "<<pty << endl; / 合法訪問(wèn),在基類中pvy為保護(hù)成員 cout << "puf= "<<puf << endl; / 合法訪問(wèn),在基類中puf為公有成員 cout << "pvz= "<<pvz << endl; / 合法訪問(wèn),pvz為派生類自己的成員 ; void main() Derive obj; obj.Setvalue(3,5, 8.9, 12.

17、6); obj.Output(); obj.Print(); cout << "puf= " << obj.puf << endl; /合法訪問(wèn),puf為基類公有成員 cout<<obj.pty<<endl; / 非法訪問(wèn),類的外部不能訪問(wèn)為基類保護(hù)成員pty system("pause");運(yùn)行輸出:class Base outputpvx= 3pty= 5puf= 8.9class Derive outputpty= 5puf= 8.9pvz= 12.6puf= 8.9【簡(jiǎn)要分析】 “cla

18、ss Derive : public Base ”表明這是一個(gè)公有繼承的例子,基類Base中有3個(gè)變量和兩個(gè)函數(shù):私有變量pvx、保護(hù)變量pty、公有變量puf和公有函數(shù)Setxy()、Output()。其中:被Derive派生類繼承后,pvx在派生類中不能直接訪問(wèn),只能通過(guò)Base中具有public屬性的函數(shù)對(duì)其間接訪問(wèn); pty被Derive派生類繼承之后仍為protected屬性,派生類成員可以直接訪問(wèn);puf、Setxy()、Output()這3個(gè)具有public屬性成員被Derive派生類繼承后,仍為public屬性,派生類成員可以對(duì)其直接訪問(wèn)。 輸出的前4行:調(diào)用“obj.Outp

19、ut();”的輸出結(jié)果。輸出的后4行:調(diào)用“obj.Print();”的輸出結(jié)果。最后1行:調(diào)用“cout << "puf= " << obj.puf << endl;”的輸出結(jié)果。結(jié)論:在公有繼承中,無(wú)論是派生類中的成員還是派生類對(duì)象都不能直接訪問(wèn)基類中的private成員;派生類的成員可以訪問(wèn)繼承來(lái)的protected成員和public成員;但是,類的外部使用者只能通過(guò)派生類的對(duì)象訪問(wèn)繼承來(lái)的public成員,不能訪問(wèn)繼承于基類的private和protected成員。二、私有繼承【例2】任務(wù)1:分析以下程序。a) 找出非法語(yǔ)句并在程

20、序中注釋非法的原因。b) 寫(xiě)出刪除非法語(yǔ)句后程序的運(yùn)行結(jié)果。源代碼:#include <iostream.h>#include <stdlib.h>class Base private: int pvx; protected: int ptf; public : void Setxf(int w, int f) pvx = w; ptf = f; void Print() cout << "pvx= " << pvx << endl; cout << "ptf= " <<

21、 ptf << endl; ;class Derive:private Base /私有繼承 private: double pvy ; protected: double ptz; public: int pd; void Setvalue(int a, int b, double c, double d) pvx = a; ptf = b + 6; Setxf(a, b); pvy = c; ptz = d; pd = 90; void Output() cout << "pvx= " << pvx << endl; Pr

22、int(); cout << "pvy= " << pvy << endl; cout << "ptz= " << ptz << endl; ; void main() Derive obj; obj.Setvalue(1, 6, 5.3, 3.8); obj.Output(); obj.Setxf(101, 87); cout << "pvx= " << obj.pvx << endl; cout << "

23、;pvy= " << obj.pvy << endl; cout << "ptz= "<<obj.ptz << endl; obj.pd = 68; cout << "pd= " << obj.pd << endl; system("pause");【簡(jiǎn)要分析】“class Derive :private Base ”表明這是一個(gè)私有繼承,Base基類中有3個(gè)變量和兩個(gè)函數(shù):私有pvx、保護(hù)ptf、公有函數(shù)Setxf()、公有函數(shù)

24、Print()?;怋ase被私有繼承之后,其protected成員在派生類中不能直接訪問(wèn);而protected成員和public成員都成了派生類的私有成員,只有派生類的成員才能直接訪問(wèn);派生類對(duì)象也不能直接訪問(wèn)繼承自Base的protected成員和public成員。結(jié)論:私有繼承中,基類中的protected、public成員都成為派生類中的private成員,派生類成員不能直接訪問(wèn)基類中的private成員,而派生類中的成員可以直接訪問(wèn)基類中的protected、public屬性的成員;派生類對(duì)象不能直接訪問(wèn)基類中的任何成員。 三、保護(hù)繼承【例3】任務(wù)2:分析以下程序。a) 找出非法語(yǔ)句

25、并在程序中注釋非法的原因。b) 寫(xiě)出刪除非法語(yǔ)句后程序的運(yùn)行結(jié)果。源代碼:#include <iostream.h>#include <stdlib.h>class Base private: int pvx; protected: int pty; public: int puz; void setx(int a) pvx = a; int getx() return pvx;class Derive:protected Base / 保護(hù)繼承 private: int pva; protected: int ptb; public: int puc; void se

26、tvalue(int a, int b, int c, int d, int e, int f) pvx = a; setx(a); pty = b; puz = c; pva = d; ptb = e; puc = f; void print() cout << "pvx= " << pvx << endl; cout << "pty= " << pty << endl; cout << "puz= " << puz << e

27、ndl; cout << "pva= " << pva << endl; cout << "ptb= " << ptb << endl; cout << "puc= " << puc << endl; ;void main() Derive obj; obj.setvalue(9, 8, 7, 6, 5, 4); obj.print(); cout << "puc= " << obj.

28、puc << endl; system("pause");結(jié)論:保護(hù)繼承中,基類中的protected、public成員都成為派生類中的protected成員,派生類成員不能直接訪問(wèn)基類中的private成員,而派生類中的成員可以直接訪問(wèn)基類中的protected、public屬性的成員;派生類對(duì)象均不能直接訪問(wèn)基類中的任何成員。  【例4】任務(wù)3:分析以下程序。找出非法語(yǔ)句并在程序中注釋非法的原因。分析以下代碼。源代碼:#include <iostream>using namespace std; class person public

29、:char name8;char gender;void show() cout<< name <<" " << gender <<" " <<age <<" " <<address<<endl; private:int age; protected: char address20; class teacher : public person /公有繼承 private :char tecpost8 ; char department20; public:void putout() cout << name << " " << address << endl; cout << age << endl; cout << department << " &quo

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論