第8章類的繼承_第1頁(yè)
第8章類的繼承_第2頁(yè)
第8章類的繼承_第3頁(yè)
第8章類的繼承_第4頁(yè)
第8章類的繼承_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、有一個(gè)招聘賺職學(xué)生的中介公司,為了掌握學(xué)生的信息,開發(fā)一個(gè)學(xué)生信息管理系統(tǒng)。其中學(xué)生信息內(nèi)容:1、本科生:學(xué)號(hào)、姓名、年齡、性別、學(xué)校、專業(yè)、英語(yǔ)水平2、研究生:學(xué)號(hào)、姓名、年齡、性別、學(xué)校、研究方向請(qǐng)問在該系統(tǒng)中如何來(lái)設(shè)計(jì)這兩類學(xué)生?請(qǐng)問在該系統(tǒng)中如何來(lái)設(shè)計(jì)這兩類學(xué)生?如果該中介公司還要招大專生,則怎么辦?如果該中介公司還要招大專生,則怎么辦?返回返回理解類的繼承理解類的繼承 理解類繼承的類型和特點(diǎn)理解類繼承的類型和特點(diǎn)掌握派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)掌握派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)掌握類的多重繼承掌握類的多重繼承理解基類與派生類的轉(zhuǎn)換理解基類與派生類的轉(zhuǎn)換理解類的繼承與組合理解類的繼承與組合解

2、決了代碼重用的問題解決了代碼重用的問題 什么是繼承?什么是繼承? 繼承是從現(xiàn)有的類創(chuàng)建新類的過程。現(xiàn)有的類稱為繼承是從現(xiàn)有的類創(chuàng)建新類的過程。現(xiàn)有的類稱為基類(父類),新類稱為派生類(子類)。基類(父類),新類稱為派生類(子類)。 財(cái)產(chǎn)繼承:子女擁有父母的財(cái)產(chǎn)。財(cái)產(chǎn)繼承:子女擁有父母的財(cái)產(chǎn)。 子女的財(cái)產(chǎn)不是零子女的財(cái)產(chǎn)不是零開始。開始。C+:子類擁有父類的成員變量和成員函數(shù)。子類的:子類擁有父類的成員變量和成員函數(shù)。子類的成員變量和成員函數(shù)不用定義也會(huì)有。成員變量和成員函數(shù)不用定義也會(huì)有。繼承解決了什么問題?繼承解決了什么問題? class A ; public繼承繼承: 最常用的繼承方式最常

3、用的繼承方式 語(yǔ)法語(yǔ)法:class B:public A ; private繼承繼承: 不常用不常用 語(yǔ)法語(yǔ)法:class B:private A ; protected繼承繼承: 不常用不常用 語(yǔ)法語(yǔ)法:class B:protected A ;訪問控制權(quán)限訪問控制權(quán)限訪問控制說明符訪問控制說明符從自身類訪問從自身類訪問從派生類訪問從派生類訪問從類外訪問從類外訪問publicpublic可以可以可以可以可以可以protectedprotected可以可以可以可以不可以不可以privateprivate可以可以不可以不可以不可以不可以繼承類型繼承類型基類成員基類成員publicpublic繼承

4、繼承privateprivate繼承繼承protectedprotected繼承繼承publicpublicpublicprivateprotectedprotectedprotectedprotectedprivateprotectedprivateprivate不被繼承不被繼承不被繼承不被繼承不被繼承不被繼承class Derived : Baseclass Derived : public Base 默認(rèn)為默認(rèn)為private例例1:開篇提出的問題。:開篇提出的問題。練習(xí)練習(xí): 1 1、P153 P153 例例8.18.1定義一個(gè)人員類定義一個(gè)人員類PersonPerson,并由,并由P

5、ersonPerson類派生出雇員類類派生出雇員類Employee,Employee,并在并在mainmain函數(shù)中使用函數(shù)中使用EmployeeEmployee對(duì)象。對(duì)象。2 2、定義一個(gè)動(dòng)物類、定義一個(gè)動(dòng)物類AnimalAnimal,由,由AnimalAnimal類派生出類派生出DogDog類。類。定義一個(gè)學(xué)生類(學(xué)號(hào)、姓名),派生出一個(gè)本科生類(學(xué)號(hào)、姓名、專業(yè)、英語(yǔ)水平)。本科生類的成員變量如何初始化?思考:思考:即用下面的方法生成對(duì)象即用下面的方法生成對(duì)象:UnderGraduate zhangSan(張三張三,珠江學(xué)院珠江學(xué)院,計(jì)算機(jī)科學(xué)計(jì)算機(jī)科學(xué));自然就會(huì)想到自然就會(huì)想到Und

6、erGraduate類構(gòu)造函數(shù):類構(gòu)造函數(shù):Student(string n,string na) no = n; name = na;UnderGraduate(string n,string na,string m)no = n; name = na; major = m;然而然而no、name是是Student類中定義的,能不能在類中定義的,能不能在Student類中對(duì)它兩初始化呢?即類中對(duì)它兩初始化呢?即:很顯然是可以的。很顯然是可以的。那么上面的那么上面的UnderGraduate構(gòu)造函數(shù)如何寫呢?構(gòu)造函數(shù)如何寫呢?簡(jiǎn)單派生類的構(gòu)造函數(shù)形式:簡(jiǎn)單派生類的構(gòu)造函數(shù)形式:派生類構(gòu)造函數(shù)名

7、派生類構(gòu)造函數(shù)名(總參數(shù)列表總參數(shù)列表):基類構(gòu)造函數(shù)名基類構(gòu)造函數(shù)名(參數(shù)列表參數(shù)列表) 派生類中新增變量初始化語(yǔ)句。派生類中新增變量初始化語(yǔ)句。UnderGradStudent(int n,string na,string m) :Student(n, na) major = m;思考:上面兩種寫法的構(gòu)造函數(shù)有什么區(qū)別?思考:上面兩種寫法的構(gòu)造函數(shù)有什么區(qū)別?練習(xí):練習(xí):class Baseprotected: int x;public:Base(int x1)x = x1;cout x endl;class Child : public Baseprivate:int y;public:

8、Child(int y1,int x1):Base(x1) y = y1;cout y endl;int main()Child c(20,15); return 0;下面程序輸出的結(jié)果是多少?下面程序輸出的結(jié)果是多少?1520該程序有錯(cuò)嗎?該程序有錯(cuò)嗎?有?;悰]有默認(rèn)有?;悰]有默認(rèn)的構(gòu)造函數(shù)的構(gòu)造函數(shù)Base() x = 10;cout x endl派生類的構(gòu)造函數(shù)調(diào)用派生類的構(gòu)造函數(shù)調(diào)用從前面的從前面的Base類和類和Child類觀察可以得知:類觀察可以得知:1、當(dāng)調(diào)用派生類的構(gòu)造方法生成對(duì)象時(shí),、當(dāng)調(diào)用派生類的構(gòu)造方法生成對(duì)象時(shí),首先調(diào)首先調(diào)用基類的構(gòu)造函數(shù),用基類的構(gòu)造函數(shù),2、當(dāng)

9、派生類的構(gòu)造函數(shù)定義中、當(dāng)派生類的構(gòu)造函數(shù)定義中沒有顯示調(diào)用沒有顯示調(diào)用基類基類的構(gòu)造函數(shù)時(shí),派生類的構(gòu)造方法調(diào)用基類的的構(gòu)造函數(shù)時(shí),派生類的構(gòu)造方法調(diào)用基類的默認(rèn)默認(rèn)構(gòu)造函數(shù)構(gòu)造函數(shù)。3、當(dāng)類中定義了有參數(shù)構(gòu)造函數(shù),系統(tǒng)默認(rèn)的構(gòu)、當(dāng)類中定義了有參數(shù)構(gòu)造函數(shù),系統(tǒng)默認(rèn)的構(gòu)造函數(shù)不再造成,需要手動(dòng)編寫無(wú)參構(gòu)造函數(shù)。造函數(shù)不再造成,需要手動(dòng)編寫無(wú)參構(gòu)造函數(shù)。下面程序輸出的結(jié)果是什么?下面程序輸出的結(jié)果是什么?class Baseprotected:int x;public:Base() cout Base Object Over! endl;class Child : public Basepri

10、vate:int y;public:Child() cout Child Object Over endl;int main()Child c;return 0;析構(gòu)函數(shù)的作用:析構(gòu)函數(shù)的作用:銷毀對(duì)象之前,進(jìn)行必要的清理工作創(chuàng)建對(duì)象的順序:創(chuàng)建對(duì)象的順序:先執(zhí)行基類的構(gòu)造函數(shù)、再執(zhí)行派生類的構(gòu)造函數(shù)。析構(gòu)函數(shù)與構(gòu)造函數(shù)調(diào)用關(guān)系:析構(gòu)函數(shù)與構(gòu)造函數(shù)調(diào)用關(guān)系: 先構(gòu)造的后析構(gòu)。銷毀對(duì)象的順序:銷毀對(duì)象的順序:先執(zhí)行派生類的析構(gòu)函數(shù),再執(zhí)行基類的析構(gòu)函數(shù)繼承的方式繼承的方式直接直接(單單)繼承繼承繼承繼承間接繼承間接繼承多重繼承多重繼承層次繼承層次繼承有公共基類有公共基類的多重繼承的多重繼承多重繼

11、承多重繼承2-1class A;class B;class C :public A, public B; ABCC既具有既具有A的成員也具的成員也具有有B的成員。的成員。多重繼承多重繼承2-2閱讀下面的程序并理解多重繼承。閱讀下面的程序并理解多重繼承。MutilDerived.cpp思考思考:假如類:假如類A和類和類B的函數(shù)都為的函數(shù)都為setValue(int,int).那那么在子類么在子類Ab的對(duì)象的對(duì)象test如何調(diào)用如何調(diào)用setValue()?兩個(gè)基類有相同的成員時(shí),多重繼承就會(huì)產(chǎn)生二兩個(gè)基類有相同的成員時(shí),多重繼承就會(huì)產(chǎn)生二義性。調(diào)用時(shí)應(yīng)該指明調(diào)用哪個(gè)基類的成員。義性。調(diào)用時(shí)應(yīng)該指

12、明調(diào)用哪個(gè)基類的成員。 test.A:setValue(12,23); test.B:setValue(34,45);練習(xí)五練習(xí)五練習(xí):練習(xí):學(xué)校附近有一家民營(yíng)小廠信息化啟步,這家小廠是生產(chǎn)圓柱體部件的,為了計(jì)算原料,需要對(duì)部件進(jìn)行計(jì)算,原來(lái)都是手工計(jì)算,但有時(shí)候在計(jì)算底部圓面積會(huì)出錯(cuò)。希望能找一個(gè)學(xué)計(jì)算機(jī)軟件的同學(xué)到廠里幫忙,設(shè)計(jì)一個(gè)程序求圓的面積。后來(lái),為了提高計(jì)算效率,工廠希望程序能直接將圓柱體的體積也計(jì)算出來(lái)。過了一段時(shí)間后,工廠為了擴(kuò)大業(yè)務(wù)范圍,也對(duì)矩形柱體進(jìn)行加工。希望程序能將矩形柱體的體積也能計(jì)算出來(lái)。Factory.cpp組合組合在一個(gè)類中,以另一個(gè)類的對(duì)象作為數(shù)據(jù)成員,稱在一

13、個(gè)類中,以另一個(gè)類的對(duì)象作為數(shù)據(jù)成員,稱為類的組合。為類的組合。組合的特點(diǎn):組合的特點(diǎn):1、成員對(duì)象的內(nèi)部細(xì)節(jié)是新對(duì)象所看不見的。所以組合是、成員對(duì)象的內(nèi)部細(xì)節(jié)是新對(duì)象所看不見的。所以組合是黑箱重用,它的封裝性較好。黑箱重用,它的封裝性較好。2、可以讓每個(gè)新的類專注于實(shí)現(xiàn)自己的任務(wù),符合單一職、可以讓每個(gè)新的類專注于實(shí)現(xiàn)自己的任務(wù),符合單一職責(zé)原則。責(zé)原則。3、類模塊之間弱耦合關(guān)系。、類模塊之間弱耦合關(guān)系。繼承與繼承與組合組合的選擇的選擇注意:要盡量使用組合,盡量不要使用繼承。注意:要盡量使用組合,盡量不要使用繼承。對(duì)于類對(duì)于類A和類和類B:1、一般情況下:當(dāng)類、一般情況下:當(dāng)類A和類和類B是

14、是屬于屬于(is a)(is a)的關(guān)系時(shí),采用的關(guān)系時(shí),采用繼承。繼承。 比如:汽車類和公交車類。比如:汽車類和公交車類。 class Bus : public Automobile2、當(dāng)類、當(dāng)類A和類和類B是包含是包含(include)關(guān)系時(shí),采用組合。關(guān)系時(shí),采用組合。比如:汽車類和輪胎類。比如:汽車類和輪胎類。3、當(dāng)需要回朔父類時(shí)用繼承,不需要回朔時(shí)父類時(shí)用組合。、當(dāng)需要回朔父類時(shí)用繼承,不需要回朔時(shí)父類時(shí)用組合。靜態(tài)成員靜態(tài)成員8-18-1 回顧回顧C(jī)中的靜態(tài)變量有什么特點(diǎn)?中的靜態(tài)變量有什么特點(diǎn)?具有全局變量的生命周期(完成了某些全局變量具有全局變量的生命周期(完成了某些全局變量才

15、能完成的功能)才能完成的功能)具有局部變量的作用域(比全局變量更安全)具有局部變量的作用域(比全局變量更安全) 在在C中定義靜態(tài)變量的語(yǔ)法:中定義靜態(tài)變量的語(yǔ)法: static int i;int f(int i) static int c = 1; c = c + i; return c;void main() printf(%dn,f(1); printf(%dn,f(1);結(jié)果:結(jié)果:23 看看下列的銀行賬戶類的設(shè)計(jì)有什么不妥?class Accountprivate: double interestRate; /利率利率 double amount; /金額金額 char owner2

16、0; /戶名戶名;1、每創(chuàng)建一個(gè)新賬戶,都要輸入、每創(chuàng)建一個(gè)新賬戶,都要輸入interestRate(利率利率);這顯然;這顯然沒有必要,因?yàn)樗匈~戶的沒有必要,因?yàn)樗匈~戶的interestRate(利率利率)都相同。都相同。2、若要修改、若要修改interestRate(利率利率),則要為每個(gè)賬戶進(jìn)行修改,則要為每個(gè)賬戶進(jìn)行修改,這顯然行不通;并且可以導(dǎo)致利率不一致。這顯然行不通;并且可以導(dǎo)致利率不一致。靜態(tài)成員靜態(tài)成員8-28-2 把把interestRate(利率)定義為全局變量(利率)定義為全局變量double interestRate;/利率;全局變量利率;全局變量class Ac

17、countprivate: double amount; /金額金額 char owner20; /戶名戶名; 把把interestRate(利率)作為類的靜態(tài)變量(利率)作為類的靜態(tài)變量class Accountprivate: static double interestRate;/利率;靜態(tài)成員變量利率;靜態(tài)成員變量 double amount; /金額金額 char owner20; /戶名戶名;靜態(tài)成員靜態(tài)成員8-38-3 static數(shù)據(jù)成員例子:數(shù)據(jù)成員例子:class Accountprivate: static double interestRate;/利率利率 double

18、 amount; /金額金額 char owner20; /戶名戶名;double Account:interestRate=0.0589;/靜態(tài)成員初始化靜態(tài)成員初始化答:這是因?yàn)槊總€(gè)答:這是因?yàn)槊總€(gè)Account對(duì)應(yīng)不同的主人,有不同對(duì)應(yīng)不同的主人,有不同數(shù)目的錢,而所有數(shù)目的錢,而所有Account的利率卻是相同的。的利率卻是相同的。問:為什么把問:為什么把interestRate聲明為聲明為static,而而amount和和owner不呢?不呢?靜態(tài)成員靜態(tài)成員8-48-4 靜態(tài)數(shù)據(jù)成員(所有對(duì)象共享,在內(nèi)存中只有一個(gè)靜態(tài)數(shù)據(jù)成員(所有對(duì)象共享,在內(nèi)存中只有一個(gè),有全局變量的作用有全局

19、變量的作用) 靜態(tài)數(shù)據(jù)成員可以初始化,但只能在類外面實(shí)現(xiàn)。靜態(tài)數(shù)據(jù)成員可以初始化,但只能在類外面實(shí)現(xiàn)。 數(shù)據(jù)類型數(shù)據(jù)類型 數(shù)名數(shù)名:靜態(tài)數(shù)據(jù)成員名靜態(tài)數(shù)據(jù)成員名 = 初值初值; 靜態(tài)數(shù)據(jù)成員既可以通過對(duì)象引用,也可以類名引靜態(tài)數(shù)據(jù)成員既可以通過對(duì)象引用,也可以類名引用(實(shí)質(zhì)并非類中的成員,所以在引用靜態(tài)成員時(shí)用(實(shí)質(zhì)并非類中的成員,所以在引用靜態(tài)成員時(shí)不需要對(duì)象,而直接用類名加作用域運(yùn)算符即可,不需要對(duì)象,而直接用類名加作用域運(yùn)算符即可,如:如:class_name:static_member) 靜態(tài)數(shù)據(jù)成員是在所有對(duì)象之外單獨(dú)開辟空間。即靜態(tài)數(shù)據(jù)成員是在所有對(duì)象之外單獨(dú)開辟空間。即使不定義對(duì)

20、象,也為靜態(tài)數(shù)據(jù)成員開辟空間。使不定義對(duì)象,也為靜態(tài)數(shù)據(jù)成員開辟空間。靜態(tài)成員靜態(tài)成員8-58-5static成員函數(shù)例子:成員函數(shù)例子:下面下面Account中成員函數(shù)中成員函數(shù)raiseInterest()和和interest()訪問訪問靜態(tài)數(shù)據(jù)成員靜態(tài)數(shù)據(jù)成員interestRate:class Account private: static double interestRate;/利率利率 double amount; /金額金額 char owner20; /戶名戶名public: void raiseInterest(double incr) interestRate+=incr ; double getInterest() return interestRate; ;靜態(tài)成員靜態(tài)成員8-68-6實(shí)際上調(diào)用上面兩個(gè)成員函數(shù)都只訪問靜態(tài)數(shù)據(jù)成員,實(shí)際上調(diào)用上面兩個(gè)成員函數(shù)都只訪問靜態(tài)數(shù)據(jù)成員,所以它們與用哪個(gè)對(duì)象來(lái)調(diào)用這個(gè)函數(shù)無(wú)關(guān)。一個(gè)好所以它們與用哪個(gè)對(duì)象來(lái)調(diào)用這個(gè)函數(shù)無(wú)關(guān)。一個(gè)好的解決方案是把它們聲明為靜態(tài)成員函數(shù)。這樣我們的解決方案是把

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論