版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、實驗8 繼承與派生一、實驗目的1 理解繼承的含義,掌握派生類的定義和實現方法。2 理解公有繼承下基類成員對派生類成員和派生類對象的可見性,能正確地使用繼承層次中的各種類成員。3 理解保護成員在繼承中的作用,能夠在適當的時候使用保護成員以便派生類成員可以訪問基類的部分非公開成員。4 理解虛基類在類的繼承層次中的作用,虛基類的引入對程序運行時的影響,能夠對使用虛基類的簡單程序寫出程序結果。二、知識要點1. 繼承繼承是C+語言的一種重要機制,它允許在已定義的類的基礎上產生新類。從已定義類產生新類的過程稱為派生。已存在的用來派生新類的類為基類,又稱父類。從已存在的類派生出的新類稱為派生類,又稱為子類。
2、如,從哺乳動物類派生出狗類,哺乳動物是父類,狗是子類;從汽車類派生出轎車類,汽車是父類,轎車是子類。在C+語言中,一個派生類可以從一個基類派生,也可以從多個基類派生。從一個基類派生的繼承稱為單繼承,從多個基類派生的繼承稱為多繼承。2. 派生類的定義格式(1)單繼承的定義格式class<派生類名>:<繼承方式><基類名><派生類新定義成員>其中:基類名是已經定義類的名稱。派生類名是新定義的一個類的名字,它是從基類中派生的;派生類是按指定繼承方式從基類派生的,繼承方式常用的有如下3種:public 表示公有繼承private 表示私有繼承protec
3、ted 表示保護繼承在單繼承中,每個類可以有多個派生類,但是每個派生類只能有一個基類,從而形成樹形結構。(2)多繼承的定義格式class<派生類名>:<繼承方式1><基類名1>,<繼承方式2><基類名2>,<派生類新定義成員>其中繼承方式1、繼承方式2、是3種繼承方式public、private和protected之一。多繼承與單繼承的主要區(qū)別從定義格式上看,主要是多繼承的基類多于一個。3. 派生類的3種繼承方式由下表來理解3種繼承方式的各自特點?;惢悆炔亢瘮祷悓ο髉rivate繼承方式protected繼承方式pu
4、blic繼承方式派生類內部函數派生類對象派生類內部函數派生類對象派生類內部函數派生類對象private成員可訪問不可訪問不可訪問不可訪問不可訪問不可訪問不可訪問不可訪問protected成員可訪問不可訪問可訪問,轉為private不可訪問可訪問,轉為protected不可訪問可訪問,保持protected不可訪問public成員可訪問可訪問可訪問,轉為private不可訪問可訪問,轉為protected不可訪問可訪問,保持public可訪問4. 派生類和基類的關系任何一個類都可以派生出很多個新類,派生類也可以再派生出新類,因此,基類和派生類是相對而言的。一個基類可以是另一個基類的派生類,這樣便
5、形成了復雜的繼承結構,出現了類的層次。一個基類派生出一個派生類,它又做另一個派生類的基類,則原來基類為該派生類的間接基類?;惡团缮愔g的關系可以有以下3種描述。(1)派生類是基類的具體化類的層次通常反映了客觀世界中某種真實的模型?;愂菍θ舾蓚€派生類的抽象,而派生類是基類的具體化?;惓槿×怂呐缮惖墓残?,而派生類通過增加行為將抽象類變?yōu)槟撤N有用的類型。(2)派生類是基類定義的延續(xù)先定義一個抽象基類,該基類中有些操作并未實現,然后定義非抽象的派生類,實現抽象基類中定義的操作。例如虛函數就屬于此類情況。這時派生類是抽象的基類的實現,既可以看成是基類定義的延續(xù),這也是派生類的一種常用方法。
6、(3)派生類是基類的組合。在多重繼承時,一個派生類有多于一個的基類,這時派生類將是所有基類行為的組合。5. 虛基類的引入和說明引進虛基類的真正目的是為了解決二義性的問題。聲明虛基類的方法是:在定義虛基類的直接派生類時,用關鍵字virtual引出基類名。6. 二義性問題一般來說,在派生類中對基類成員的訪問應該是唯一的,但是由于多繼承情況下,可能造成對基類中某個成員的訪問出現不唯一的情況,則稱為對基類成員訪問的二義性問題。由多重繼承引起的二義性問題是指:當一個派生類從多個基類派生,而這些基類又有一個共同的基類,則對該基類中說明的成員進行訪問時,可能會出現二義性。7. 派生類構造函數和析構函數(1)
7、 派生類的對象的數據成員是由基類中說明的數據成員和派生類中說明的數據成員共同構成。將派生類的對象中由基類說明的數據成員和操作所構成的封裝體稱為基類子對象,它由基類中的構造函數進行初始化。(2) 構造函數不能夠被繼承,因此派生類的構造函數必須通過調用基類的構造函數來初始化基類子對象。所以在定義派生類的構造函數時除了對自己的數據成員進行初始化外,還必須負責調用基類構造函數使基類的數據成員得以初始化,如果派生類中還有子對象時,還應該包含對子對象初始化的構造函數。(3) 派生類構造函數的一般格式如下(派生類名)(<派生類構造函數總參數表>):<基類構造函數>(<參數表1&
8、gt;),<子對象名>(<參數表2>)<派生類中數據成員初始化>(4) 派生類構造函數的調用順序如下:基類的構造函數->子對象類的構造函數->派生類的構造函數(5) 當對象被刪除時,派生類的析構函數被執(zhí)行。由于析構函數不能被繼承,因此在執(zhí)行派生類的析構函數時,基類的析構函數也將被調用。執(zhí)行順序是先執(zhí)行派生類的析構函數,再執(zhí)行基類的析構函數,其順序與執(zhí)行構造函數時的順序正好相反。(6) 派生類構造函數使用中應注意的問題:派生類構造函數的定義中可以省略對基類構造函數的調用,其條件是在基類中必須有默認的構造函數或者根本沒有定義構造函數。當然,如果基類中
9、沒有定義構造函數,那么派生類根本不必負責調用基類構造函數。當基類的構造函數使用一個或多個參數時,則派生類必須定義構造函數,提供將參數傳遞給基類構造函數的途徑。在某些情況下,派生類構造函數的函數體可能為空,僅起到參數傳遞作用。三、實驗內容和步驟1定義和使用類的繼承關系與定義派生類【實例1】編寫一個學生和教師數據輸入和顯示程序,學生數據有編號、姓名、班級和成績,教師數據有編號、姓名、職稱和部門。要求將編號、姓名的輸入和顯示設計成一個類Person,并作為學生數據操作類Student和教師數據操作類Teacher的基類。題目分析:由題目可以得出需要設計一個Person基類,Teacher類和Stud
10、ent類都是由Person類派生的,即Teacher類和Student類都是由Person類繼承而來,并且Teacher類和Student類都有編號和姓名數據成員,可以把它們作為Person類的公有或保護數據成員。程序示例:#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兩個函數放在Person類中。實驗要求:1) 上機運行該程序。2) 為Teacher類編寫系別和職稱的輸入/輸出函數;為Student類編寫班級和成績的輸入/輸出函數。2熟悉不同方式下對基類成員的訪問控制【實例2】給出下面程序的執(zhí)行結果。#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();運行結果:(1,2)(5,6)(6,9)注意:(1)類A和類B中的數據成員都是私有屬性,故對它們的訪問只能通過成員函數。(2)注意對象的初始化方法。實驗要求:上機運行程序,并修改已知數據,分析結果?!緦嵗?】指出下面程序的錯誤并改正之。#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();題目分析:一個類被私有繼承之后,其成員在派生類中訪問屬性會變?yōu)閜rivate,因而在派生類的對象rect不能直接訪問基類的成員函數add。有兩種改正的方法:第一改變繼承方式;第二在派生類中重新定義add函數。實驗要求:1) 上機運行該程序,分析給出的錯誤提示。2) 按照上面兩種方法,改正程序,程序編譯通過后,給出運行結果。3.分析下
17、列程序中的訪問權限,并回答所提的問題#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;回答下列問題:(1) 派生類B中成員函數f2能否訪問基類A中的成員函數f1和數據成員i1、j1?(2) 派生類B的對象b能否訪問基類A中的成
18、員函數f1和數據成員i1、j1?(3) 派生類C中成員函數f3能否訪問直接基類B中的成員函數f2和數據成員j2?能否訪問間接基類A中的成員函數f1和數據成員i1、j1?(4) 派生類C的對象c能否訪問直接基類B中的成員函數f2和數據成員j2?能否訪問間接基類A中的成員函數f1和數據成員i1、j1? (5) 從對(1)(4)問題的回答可以得出對公有繼承有什么結論?(在公有繼承時,派生類的成員函數可以訪問基類中的公有成員和保護成員,派生類的對象僅可以訪問基類中的公有成員。)4.利用虛基類解決二義性問題【實例4】 同一基類被多次繼承產生的二義性#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;四、思考與練習1. 在什么情況下會發(fā)生二義性問題?如何解決二義性問題?2. 派生類構造函數和基類構造函數有什么關系?3. 定義一個哺乳動物類Mammal,并從中派生出一個狗類Dog,下面給出Mammal類的定義,要求:(1) 添加Dog類的顏色數據成員,訪問屬性為私有,通過SetColor和GetColor成員函數來對顏色進行設置和獲取。(2) 分別為基類和派生類添加相應的構造函數(有參、無參)和析構函數,并進行測試。class Mammalprotected:int itsAge;int itsWeight;public:int
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度版權授權使用合同(含授權范圍和費用支付)
- 2024年產品發(fā)布會合作合同
- 2024年廣州臨時工雇傭合同
- 2024年度短視頻內容創(chuàng)作與版權交易合同
- 2024年工程吊籃長期租借協議
- 2024年度智能供應鏈管理軟件購買合同
- 2024酒店用品采購合同模板
- 2024年農民工建筑行業(yè)用工合同
- 2024【工程勞務分包合同范本】裝飾工程分包合同范本3
- 2024年度電力工程吊裝安全合同
- GB/T 10193-1997電子設備用壓敏電阻器第1部分:總規(guī)范
- 基于solidworks flow simulation油浸式變壓器散熱優(yōu)化分析
- CPK與CP詳細講解資料(課堂PPT)
- 光動力治療在氣道腫瘤中的臨床應用課件
- 小學語文人教三年級上冊 群文閱讀《奇妙的中心句》
- 大數據和人工智能知識考試題庫600題(含答案)
- 2023年上海機場集團有限公司校園招聘筆試題庫及答案解析
- 鏡頭的角度和方位課件
- 污水處理常用藥劑簡介知識講解課件
- 五年級上冊英語課件-Unit 1《My future》第1課時牛津上海版(三起) (共28張PPT)
- 光交接箱施工規(guī)范方案
評論
0/150
提交評論