實(shí)驗(yàn)8繼承與派生_第1頁(yè)
實(shí)驗(yàn)8繼承與派生_第2頁(yè)
實(shí)驗(yàn)8繼承與派生_第3頁(yè)
實(shí)驗(yàn)8繼承與派生_第4頁(yè)
實(shí)驗(yàn)8繼承與派生_第5頁(yè)
已閱讀5頁(yè),還剩4頁(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、實(shí)驗(yàn)8 繼承與派生一、實(shí)驗(yàn)?zāi)康? 理解繼承的含義,掌握派生類的定義和實(shí)現(xiàn)方法。2 理解公有繼承下基類成員對(duì)派生類成員和派生類對(duì)象的可見(jiàn)性,能正確地使用繼承層次中的各種類成員。3 理解保護(hù)成員在繼承中的作用,能夠在適當(dāng)?shù)臅r(shí)候使用保護(hù)成員以便派生類成員可以訪問(wèn)基類的部分非公開(kāi)成員。4 理解虛基類在類的繼承層次中的作用,虛基類的引入對(duì)程序運(yùn)行時(shí)的影響,能夠?qū)κ褂锰摶惖暮?jiǎn)單程序?qū)懗龀绦蚪Y(jié)果。二、知識(shí)要點(diǎn)1. 繼承繼承是C+語(yǔ)言的一種重要機(jī)制,它允許在已定義的類的基礎(chǔ)上產(chǎn)生新類。從已定義類產(chǎn)生新類的過(guò)程稱為派生。已存在的用來(lái)派生新類的類為基類,又稱父類。從已存在的類派生出的新類稱為派生類,又稱為子類。

2、如,從哺乳動(dòng)物類派生出狗類,哺乳動(dòng)物是父類,狗是子類;從汽車類派生出轎車類,汽車是父類,轎車是子類。在C+語(yǔ)言中,一個(gè)派生類可以從一個(gè)基類派生,也可以從多個(gè)基類派生。從一個(gè)基類派生的繼承稱為單繼承,從多個(gè)基類派生的繼承稱為多繼承。2. 派生類的定義格式(1)單繼承的定義格式class<派生類名>:<繼承方式><基類名><派生類新定義成員>其中:基類名是已經(jīng)定義類的名稱。派生類名是新定義的一個(gè)類的名字,它是從基類中派生的;派生類是按指定繼承方式從基類派生的,繼承方式常用的有如下3種:public 表示公有繼承private 表示私有繼承protec

3、ted 表示保護(hù)繼承在單繼承中,每個(gè)類可以有多個(gè)派生類,但是每個(gè)派生類只能有一個(gè)基類,從而形成樹(shù)形結(jié)構(gòu)。(2)多繼承的定義格式class<派生類名>:<繼承方式1><基類名1>,<繼承方式2><基類名2>,<派生類新定義成員>其中繼承方式1、繼承方式2、是3種繼承方式public、private和protected之一。多繼承與單繼承的主要區(qū)別從定義格式上看,主要是多繼承的基類多于一個(gè)。3. 派生類的3種繼承方式由下表來(lái)理解3種繼承方式的各自特點(diǎn)。基類基類內(nèi)部函數(shù)基類對(duì)象private繼承方式protected繼承方式pu

4、blic繼承方式派生類內(nèi)部函數(shù)派生類對(duì)象派生類內(nèi)部函數(shù)派生類對(duì)象派生類內(nèi)部函數(shù)派生類對(duì)象private成員可訪問(wèn)不可訪問(wèn)不可訪問(wèn)不可訪問(wèn)不可訪問(wèn)不可訪問(wèn)不可訪問(wèn)不可訪問(wèn)protected成員可訪問(wèn)不可訪問(wèn)可訪問(wèn),轉(zhuǎn)為private不可訪問(wèn)可訪問(wèn),轉(zhuǎn)為protected不可訪問(wèn)可訪問(wèn),保持protected不可訪問(wèn)public成員可訪問(wèn)可訪問(wèn)可訪問(wèn),轉(zhuǎn)為private不可訪問(wèn)可訪問(wèn),轉(zhuǎn)為protected不可訪問(wèn)可訪問(wèn),保持public可訪問(wèn)4. 派生類和基類的關(guān)系任何一個(gè)類都可以派生出很多個(gè)新類,派生類也可以再派生出新類,因此,基類和派生類是相對(duì)而言的。一個(gè)基類可以是另一個(gè)基類的派生類,這樣便

5、形成了復(fù)雜的繼承結(jié)構(gòu),出現(xiàn)了類的層次。一個(gè)基類派生出一個(gè)派生類,它又做另一個(gè)派生類的基類,則原來(lái)基類為該派生類的間接基類。基類和派生類之間的關(guān)系可以有以下3種描述。(1)派生類是基類的具體化類的層次通常反映了客觀世界中某種真實(shí)的模型。基類是對(duì)若干個(gè)派生類的抽象,而派生類是基類的具體化?;惓槿×怂呐缮惖墓残?,而派生類通過(guò)增加行為將抽象類變?yōu)槟撤N有用的類型。(2)派生類是基類定義的延續(xù)先定義一個(gè)抽象基類,該基類中有些操作并未實(shí)現(xiàn),然后定義非抽象的派生類,實(shí)現(xiàn)抽象基類中定義的操作。例如虛函數(shù)就屬于此類情況。這時(shí)派生類是抽象的基類的實(shí)現(xiàn),既可以看成是基類定義的延續(xù),這也是派生類的一種常用方法。

6、(3)派生類是基類的組合。在多重繼承時(shí),一個(gè)派生類有多于一個(gè)的基類,這時(shí)派生類將是所有基類行為的組合。5. 虛基類的引入和說(shuō)明引進(jìn)虛基類的真正目的是為了解決二義性的問(wèn)題。聲明虛基類的方法是:在定義虛基類的直接派生類時(shí),用關(guān)鍵字virtual引出基類名。6. 二義性問(wèn)題一般來(lái)說(shuō),在派生類中對(duì)基類成員的訪問(wèn)應(yīng)該是唯一的,但是由于多繼承情況下,可能造成對(duì)基類中某個(gè)成員的訪問(wèn)出現(xiàn)不唯一的情況,則稱為對(duì)基類成員訪問(wèn)的二義性問(wèn)題。由多重繼承引起的二義性問(wèn)題是指:當(dāng)一個(gè)派生類從多個(gè)基類派生,而這些基類又有一個(gè)共同的基類,則對(duì)該基類中說(shuō)明的成員進(jìn)行訪問(wèn)時(shí),可能會(huì)出現(xiàn)二義性。7. 派生類構(gòu)造函數(shù)和析構(gòu)函數(shù)(1)

7、 派生類的對(duì)象的數(shù)據(jù)成員是由基類中說(shuō)明的數(shù)據(jù)成員和派生類中說(shuō)明的數(shù)據(jù)成員共同構(gòu)成。將派生類的對(duì)象中由基類說(shuō)明的數(shù)據(jù)成員和操作所構(gòu)成的封裝體稱為基類子對(duì)象,它由基類中的構(gòu)造函數(shù)進(jìn)行初始化。(2) 構(gòu)造函數(shù)不能夠被繼承,因此派生類的構(gòu)造函數(shù)必須通過(guò)調(diào)用基類的構(gòu)造函數(shù)來(lái)初始化基類子對(duì)象。所以在定義派生類的構(gòu)造函數(shù)時(shí)除了對(duì)自己的數(shù)據(jù)成員進(jìn)行初始化外,還必須負(fù)責(zé)調(diào)用基類構(gòu)造函數(shù)使基類的數(shù)據(jù)成員得以初始化,如果派生類中還有子對(duì)象時(shí),還應(yīng)該包含對(duì)子對(duì)象初始化的構(gòu)造函數(shù)。(3) 派生類構(gòu)造函數(shù)的一般格式如下(派生類名)(<派生類構(gòu)造函數(shù)總參數(shù)表>):<基類構(gòu)造函數(shù)>(<參數(shù)表1&

8、gt;),<子對(duì)象名>(<參數(shù)表2>)<派生類中數(shù)據(jù)成員初始化>(4) 派生類構(gòu)造函數(shù)的調(diào)用順序如下:基類的構(gòu)造函數(shù)->子對(duì)象類的構(gòu)造函數(shù)->派生類的構(gòu)造函數(shù)(5) 當(dāng)對(duì)象被刪除時(shí),派生類的析構(gòu)函數(shù)被執(zhí)行。由于析構(gòu)函數(shù)不能被繼承,因此在執(zhí)行派生類的析構(gòu)函數(shù)時(shí),基類的析構(gòu)函數(shù)也將被調(diào)用。執(zhí)行順序是先執(zhí)行派生類的析構(gòu)函數(shù),再執(zhí)行基類的析構(gòu)函數(shù),其順序與執(zhí)行構(gòu)造函數(shù)時(shí)的順序正好相反。(6) 派生類構(gòu)造函數(shù)使用中應(yīng)注意的問(wèn)題:派生類構(gòu)造函數(shù)的定義中可以省略對(duì)基類構(gòu)造函數(shù)的調(diào)用,其條件是在基類中必須有默認(rèn)的構(gòu)造函數(shù)或者根本沒(méi)有定義構(gòu)造函數(shù)。當(dāng)然,如果基類中

9、沒(méi)有定義構(gòu)造函數(shù),那么派生類根本不必負(fù)責(zé)調(diào)用基類構(gòu)造函數(shù)。當(dāng)基類的構(gòu)造函數(shù)使用一個(gè)或多個(gè)參數(shù)時(shí),則派生類必須定義構(gòu)造函數(shù),提供將參數(shù)傳遞給基類構(gòu)造函數(shù)的途徑。在某些情況下,派生類構(gòu)造函數(shù)的函數(shù)體可能為空,僅起到參數(shù)傳遞作用。三、實(shí)驗(yàn)內(nèi)容和步驟1定義和使用類的繼承關(guān)系與定義派生類【實(shí)例1】編寫(xiě)一個(gè)學(xué)生和教師數(shù)據(jù)輸入和顯示程序,學(xué)生數(shù)據(jù)有編號(hào)、姓名、班級(jí)和成績(jī),教師數(shù)據(jù)有編號(hào)、姓名、職稱和部門(mén)。要求將編號(hào)、姓名的輸入和顯示設(shè)計(jì)成一個(gè)類Person,并作為學(xué)生數(shù)據(jù)操作類Student和教師數(shù)據(jù)操作類Teacher的基類。題目分析:由題目可以得出需要設(shè)計(jì)一個(gè)Person基類,Teacher類和Stud

10、ent類都是由Person類派生的,即Teacher類和Student類都是由Person類繼承而來(lái),并且Teacher類和Student類都有編號(hào)和姓名數(shù)據(jù)成員,可以把它們作為Person類的公有或保護(hù)數(shù)據(jù)成員。程序示例:#include<iostream.h>class Personprotected:char name10;int number;public: void input()cin>>name>>number;void show()cout<<name<<"t"<<number<&

11、lt;endl;class Student :public Personchar sclass10;float score;class Teacher :public Personchar dept10;char title6;void main()Student s1;Teacher t1;cout<<"Please input the name and the number of a student:"<<endl;s1.input();s1.show();cout<<"Please input the name and t

12、he number of a teacher:"<<endl;t1.input();t1.show();注意:把input和show兩個(gè)函數(shù)放在Person類中。實(shí)驗(yàn)要求:1) 上機(jī)運(yùn)行該程序。2) 為T(mén)eacher類編寫(xiě)系別和職稱的輸入/輸出函數(shù);為Student類編寫(xiě)班級(jí)和成績(jī)的輸入/輸出函數(shù)。2熟悉不同方式下對(duì)基類成員的訪問(wèn)控制【實(shí)例2】給出下面程序的執(zhí)行結(jié)果。#include<iostream.h>class Apublic: A (int i,int j) a=i; b=j;void move(int x,int y) a+=x;b+=y;void

13、show()cout<<"("<<a<<","<<b<<")"<<endl;private:int a,b;class B : public Apublic: B(int i,int j,int k,int l) : A(i,j) x=k; y=l;void show()cout<<x<<","<<y<<endl;void fun() move(3,5);void f1() A:show();pr

14、ivate:int x,y;void main()A a(1,2);a.show();B b(3,4,5,6);b.fun();b.show();b.f1();運(yùn)行結(jié)果:(1,2)(5,6)(6,9)注意:(1)類A和類B中的數(shù)據(jù)成員都是私有屬性,故對(duì)它們的訪問(wèn)只能通過(guò)成員函數(shù)。(2)注意對(duì)象的初始化方法。實(shí)驗(yàn)要求:上機(jī)運(yùn)行程序,并修改已知數(shù)據(jù),分析結(jié)果?!緦?shí)例3】指出下面程序的錯(cuò)誤并改正之。#include<iostream.h>class Pointint x,y;public: Point (int xx,int yy)x=xx;y=yy;void add(int xa,in

15、t ya)x+=xa;y+=ya;void show()cout<<"x="<<x<<","<<"y="<<y<<endl;class Rect:private Pointint len,width;public: Rect (int x,int y,int ll,int ww) : Point (x,y)len=ll;width=ww;void showRect()show();cout<<"length="<<len

16、<<","<<"width="<<width<<endl;void main()Rect rect(0,2,3,6);rect.add(4,5);rect.showRect();題目分析:一個(gè)類被私有繼承之后,其成員在派生類中訪問(wèn)屬性會(huì)變?yōu)閜rivate,因而在派生類的對(duì)象rect不能直接訪問(wèn)基類的成員函數(shù)add。有兩種改正的方法:第一改變繼承方式;第二在派生類中重新定義add函數(shù)。實(shí)驗(yàn)要求:1) 上機(jī)運(yùn)行該程序,分析給出的錯(cuò)誤提示。2) 按照上面兩種方法,改正程序,程序編譯通過(guò)后,給出運(yùn)行結(jié)果。3.分析下

17、列程序中的訪問(wèn)權(quán)限,并回答所提的問(wèn)題#include<iostream.h>class Aint i1;public: void f1();private:int j1;class B : public Aint i2;public: void f2();private:int j2;class C : public Bint i3;public: void f3();private:int j3;void main()A a;B b;C c;回答下列問(wèn)題:(1) 派生類B中成員函數(shù)f2能否訪問(wèn)基類A中的成員函數(shù)f1和數(shù)據(jù)成員i1、j1?(2) 派生類B的對(duì)象b能否訪問(wèn)基類A中的成

18、員函數(shù)f1和數(shù)據(jù)成員i1、j1?(3) 派生類C中成員函數(shù)f3能否訪問(wèn)直接基類B中的成員函數(shù)f2和數(shù)據(jù)成員j2?能否訪問(wèn)間接基類A中的成員函數(shù)f1和數(shù)據(jù)成員i1、j1?(4) 派生類C的對(duì)象c能否訪問(wèn)直接基類B中的成員函數(shù)f2和數(shù)據(jù)成員j2?能否訪問(wèn)間接基類A中的成員函數(shù)f1和數(shù)據(jù)成員i1、j1? (5) 從對(duì)(1)(4)問(wèn)題的回答可以得出對(duì)公有繼承有什么結(jié)論?(在公有繼承時(shí),派生類的成員函數(shù)可以訪問(wèn)基類中的公有成員和保護(hù)成員,派生類的對(duì)象僅可以訪問(wèn)基類中的公有成員。)4.利用虛基類解決二義性問(wèn)題【實(shí)例4】 同一基類被多次繼承產(chǎn)生的二義性#include<iostream.h>cl

19、ass Xprotected: int a;public: X()a=10;class X1 : public Xpublic: X1()cout<<"X1 "<<a<<"n"class X2 : public Xpublic: X2()cout<<"X2 "<<a<<"n"class y : public X1, public X2public: y()cout<<X1:a<<"n"cout<

20、<X2:a<<"n"void main()y obj;四、思考與練習(xí)1. 在什么情況下會(huì)發(fā)生二義性問(wèn)題?如何解決二義性問(wèn)題?2. 派生類構(gòu)造函數(shù)和基類構(gòu)造函數(shù)有什么關(guān)系?3. 定義一個(gè)哺乳動(dòng)物類Mammal,并從中派生出一個(gè)狗類Dog,下面給出Mammal類的定義,要求:(1) 添加Dog類的顏色數(shù)據(jù)成員,訪問(wèn)屬性為私有,通過(guò)SetColor和GetColor成員函數(shù)來(lái)對(duì)顏色進(jìn)行設(shè)置和獲取。(2) 分別為基類和派生類添加相應(yīng)的構(gòu)造函數(shù)(有參、無(wú)參)和析構(gòu)函數(shù),并進(jìn)行測(cè)試。class Mammalprotected:int itsAge;int itsWeight;public:int

溫馨提示

  • 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)論