![(中職)編程語言基礎(chǔ)-C++模塊9教學(xué)課件_第1頁](http://file4.renrendoc.com/view/78e7f60fdf7d1070e6adf34291761777/78e7f60fdf7d1070e6adf342917617771.gif)
![(中職)編程語言基礎(chǔ)-C++模塊9教學(xué)課件_第2頁](http://file4.renrendoc.com/view/78e7f60fdf7d1070e6adf34291761777/78e7f60fdf7d1070e6adf342917617772.gif)
![(中職)編程語言基礎(chǔ)-C++模塊9教學(xué)課件_第3頁](http://file4.renrendoc.com/view/78e7f60fdf7d1070e6adf34291761777/78e7f60fdf7d1070e6adf342917617773.gif)
![(中職)編程語言基礎(chǔ)-C++模塊9教學(xué)課件_第4頁](http://file4.renrendoc.com/view/78e7f60fdf7d1070e6adf34291761777/78e7f60fdf7d1070e6adf342917617774.gif)
![(中職)編程語言基礎(chǔ)-C++模塊9教學(xué)課件_第5頁](http://file4.renrendoc.com/view/78e7f60fdf7d1070e6adf34291761777/78e7f60fdf7d1070e6adf342917617775.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、YCF正版可修改PPT(中職)編程語言基礎(chǔ)-C+模塊9教學(xué)課件模塊9多態(tài)與虛函數(shù)任務(wù)1多態(tài)概述任務(wù)2靜態(tài)聯(lián)編與動態(tài)聯(lián)編任務(wù)3虛函數(shù)返回任務(wù)1多態(tài)概述9. 1 .1 多態(tài)的概念多態(tài)就是通過類的繼承,使得同一個函數(shù)可以根據(jù)調(diào)用它的對象的類型不同作出不同的響應(yīng)。它與繼承和重載共同構(gòu)成了面向?qū)ο蟮娜缶幊烫匦浴?多態(tài)是通過虛函數(shù)來實(shí)現(xiàn)的,虛函數(shù)的使用本質(zhì)就是將派生類類型的指針賦給基類類型的指針,虛函數(shù)被調(diào)用時會動態(tài)的判斷調(diào)用對象的類型,從而給出相應(yīng)的響應(yīng)。9. 1. 2多態(tài)的應(yīng)用下面通過一個例子來說明關(guān)于多態(tài)的應(yīng)用。下一頁返回任務(wù)1多態(tài)概述【例9一1】設(shè)計(jì)車輛類Vehicle,提供成員函數(shù)drive表
2、示開車,定義drive為純虛函數(shù);派生轎車Car類,提供成員函數(shù)drive表示開轎車;派生卡車Truck類,提供成員函數(shù)drive表示開卡車;Car類和Truck類都繼承Vehicle類。Vehicle類提供一個純虛函數(shù)drive:表示開車。 定義Vehicle類,成員函數(shù)drive()為純虛函數(shù)。上一頁下一頁返回任務(wù)1多態(tài)概述上一頁下一頁返回任務(wù)1多態(tài)概述上一頁下一頁返回任務(wù)1多態(tài)概述實(shí)例化一個Car類的對象和一個Truck類的對象,先各自調(diào)用各自的drive()函數(shù),然后將Car類和Truck類對象的指針分別賦給一個指向Vehicle類的指針,再次調(diào)用driver()函數(shù),比較結(jié)果。上一頁
3、下一頁返回任務(wù)1多態(tài)概述上一頁下一頁返回任務(wù)1多態(tài)概述運(yùn)行結(jié)果為:啟動轎車!啟動卡車!-啟動轎車!啟動卡車! 觀察函數(shù)dirver,就會發(fā)現(xiàn)它并沒有對傳遞來的參數(shù)進(jìn)行判斷,而是直接調(diào)用成員函數(shù)drive,至于是哪個類的成員函數(shù),則是在執(zhí)行程序的時候確定的。下一次如果又添加了繼承VelllC;le類的新的子類,函數(shù)drive:一也不需要更改,只要新的繼承子類重寫了drive函數(shù),drive:就可以調(diào)用到它。上一頁返回任務(wù)2靜態(tài)聯(lián)編與動態(tài)聯(lián)編在C+中,多態(tài)性主要是通過函數(shù)重載實(shí)現(xiàn)的。重載函數(shù)是指程序中對同名函數(shù)進(jìn)行調(diào)用時,編譯器會根據(jù)函數(shù)參數(shù)的類型和個數(shù),決定該調(diào)用哪一段函數(shù)代碼來處理這個函數(shù)調(diào)用
4、。這種把函數(shù)調(diào)用與適當(dāng)?shù)暮瘮?shù)代碼相對應(yīng)的動作,叫做聯(lián)編(binding) 聯(lián)編分為靜態(tài)聯(lián)編和動態(tài)聯(lián)編。在編譯階段決定執(zhí)行哪個同名的被調(diào)用函數(shù),這稱為靜態(tài)聯(lián)編。而在編譯階段不能決定執(zhí)行哪個同名的被調(diào)用函數(shù),只在執(zhí)行階段才能依據(jù)要處理的對象類型來決定執(zhí)行哪個類的成員函數(shù),這叫動態(tài)聯(lián)編。下一頁返回任務(wù)2靜態(tài)聯(lián)編與動態(tài)聯(lián)編多態(tài)性一也分為靜態(tài)和動態(tài)兩種。靜態(tài)多態(tài)性是指定義在一個類或一個函數(shù)中的同名函數(shù),它們可根據(jù)參數(shù)表(類型及個數(shù))區(qū)別,并通過靜態(tài)聯(lián)編實(shí)現(xiàn),例如在一個類中定義的不同參數(shù)的構(gòu)造函數(shù)以及運(yùn)算符重載等,這些內(nèi)容在前面都有介紹。動態(tài)多態(tài)性是指定義在一個類層次的不同類中的重載函數(shù),它們一般具有相同
5、的參數(shù)表,因而要根據(jù)指針指向的對象所在類來區(qū)別,它通過動態(tài)聯(lián)編實(shí)現(xiàn)。 為了進(jìn)一步講述靜態(tài)聯(lián)編和動態(tài)聯(lián)編的區(qū)別,我們通過一個例子說明。上一頁下一頁返回任務(wù)2靜態(tài)聯(lián)編與動態(tài)聯(lián)編【例9 -2】以下程序用于計(jì)算并顯示大學(xué)生和研究生的學(xué)費(fèi)。上一頁下一頁返回任務(wù)2靜態(tài)聯(lián)編與動態(tài)聯(lián)編上一頁下一頁返回任務(wù)2靜態(tài)聯(lián)編與動態(tài)聯(lián)編上一頁下一頁返回任務(wù)2靜態(tài)聯(lián)編與動態(tài)聯(lián)編上一頁下一頁返回任務(wù)2靜態(tài)聯(lián)編與動態(tài)聯(lián)編上一頁下一頁返回任務(wù)2靜態(tài)聯(lián)編與動態(tài)聯(lián)編上一頁下一頁返回任務(wù)2靜態(tài)聯(lián)編與動態(tài)聯(lián)編上一頁下一頁返回任務(wù)2靜態(tài)聯(lián)編與動態(tài)聯(lián)編本例設(shè)計(jì)了一個student類,其中的calfee()函數(shù)用于輸人一個大學(xué)生的學(xué)號和姓名并
6、計(jì)算學(xué)費(fèi),disp()用于顯示大學(xué)生的學(xué)費(fèi)。graduate類是從student類派生的,其中的calfee()函數(shù)用于輸人一個研究生的學(xué)號和姓名并計(jì)算學(xué)費(fèi),disp()用于顯示研究生的學(xué)費(fèi)。在main()函數(shù)中,定義了一個student對象s1和一個graduate對象s2。當(dāng)調(diào)用fn ( s1)函數(shù)時,希望輸出大學(xué)生s1的學(xué)費(fèi);調(diào)用fn ( s2)函數(shù)時,希望輸出研究生s2的學(xué)費(fèi)。本程序的一次執(zhí)行結(jié)果如下:大學(xué)生收費(fèi) 學(xué)號:1上一頁下一頁返回任務(wù)2靜態(tài)聯(lián)編與動態(tài)聯(lián)編娃名:下艷學(xué)費(fèi):4800住宿費(fèi):1100 書報費(fèi):400 其他:200 點(diǎn)費(fèi)用:(i500研究生收費(fèi) 學(xué)縣:120上一頁下一頁
7、返回任務(wù)2靜態(tài)聯(lián)編與動態(tài)聯(lián)編 姓名:張軍 學(xué)費(fèi):4800 住宿費(fèi):1100 書報費(fèi):400 其他:200 總費(fèi)用:6500上一頁下一頁返回任務(wù)2靜態(tài)聯(lián)編與動態(tài)聯(lián)編 我們看到,執(zhí)行fn(s1)是正確的,而執(zhí)行fn(s2)錯誤,這里仍然輸出一個大學(xué)生的學(xué)費(fèi)。為什么出現(xiàn)這種情況呢?這是因?yàn)楹瘮?shù)fn ( student&x)在編譯時就確定其對象為student,所以調(diào)用的x. calfee()和x.disp()均為student類的成員函數(shù)。而我們希望在執(zhí)行fn ( s)時根據(jù)s對象來確定調(diào)用的是student類的成員函數(shù)還是graduate類的成員函數(shù)。這里采用的是靜態(tài)聯(lián)編。 解決這一問題是采用動態(tài)
8、聯(lián)編,即在執(zhí)行fn ( s)時根據(jù)s對象來自動確定調(diào)用相應(yīng)的成員函數(shù),而不是在編譯時就確定哪個重載函數(shù)被調(diào)用。這種在運(yùn)行時能依據(jù)其類型確認(rèn)調(diào)用哪個函數(shù)的能力稱為多態(tài)性,一也就是動態(tài)聯(lián)編。 C+使用虛函數(shù)來指定哪些函數(shù)需用動態(tài)聯(lián)編的方式處理,其他非虛函數(shù)在編譯連接階段采用靜態(tài)聯(lián)編方式,以節(jié)省執(zhí)行階段的時間。上一頁返回任務(wù)3虛函數(shù) 虛函數(shù)是動態(tài)聯(lián)編的基礎(chǔ)。虛函數(shù)是成員函數(shù),而且是非靜態(tài)的成員函數(shù)。如果某類中的一個成員函數(shù)被說明為虛函數(shù),這就意味著該成員函數(shù)在派生類中可能有不同的實(shí)現(xiàn)。9. 3.1 虛函數(shù)的定義與應(yīng)用在引人虛函數(shù)的概念之前,要先回顧一下switch語句。switch語句可以根據(jù)每一種
9、對象的類型選擇對該對象進(jìn)行相應(yīng)的操作,假設(shè)要求一個圖形的面積,對于不同的圖形有不同的求面積的方法,利用switch語句可以這樣來實(shí)現(xiàn):下一頁返回任務(wù)3虛函數(shù)switch(圖形) 點(diǎn):面積=();break;圓形:面積=半徑半徑;break正方形:面積=邊長邊長;break;三角形:面積=底高2 ; break上一頁下一頁返回任務(wù)3虛函數(shù)switch語句的缺點(diǎn)在于每增加一個圖像類型的時候,就要修改上述的程序,這樣做很費(fèi)時而且容易出錯。 虛函數(shù)的引人就是為了解決上述問題。虛函數(shù)是和派生類聯(lián)系在一起的,它有多態(tài)性,即派生的類有共同的函數(shù),這些共同的函數(shù)有著相同的函數(shù)名稱和相同的參數(shù),但是卻有著各自不
10、同的具體的實(shí)現(xiàn)部分。多態(tài)是面向?qū)ο蟪绦蛟O(shè)計(jì)和面向過程程序設(shè)計(jì)的主要區(qū)別之一,所謂多態(tài)就是同一個處理名稱可以用來處理多種不同的情況。 虛函數(shù)的定義方法如下:上一頁下一頁返回任務(wù)3虛函數(shù)virtual;定義虛函數(shù)要遵循以下規(guī)定。類的靜態(tài)成員函數(shù)不可以定義為虛函數(shù)。類的構(gòu)造函數(shù)不可以定義為虛函數(shù)。非類的函數(shù)不可以定義為虛函數(shù)。下面通過一個例子來說明虛函數(shù)的使用方法。上一頁下一頁返回任務(wù)3虛函數(shù)【例9 -3】定義Point類,包含兩個數(shù)據(jù)成員Px和Pv,分別表示點(diǎn)的橫坐標(biāo)和縱坐標(biāo),提供成員函數(shù)area)求點(diǎn)的面積(為0),將area定義為虛函數(shù);由Point類派生Circle類,類Circle增加1個
11、數(shù)據(jù)成員:,表示圓的半徑,提供成員函數(shù)area)求圓的面積。 首先,定義Point類,包含兩個數(shù)據(jù)成員Px和Py,表示點(diǎn)的橫、縱坐標(biāo),數(shù)據(jù)類型為int;包含成員函數(shù)area()表示求點(diǎn)的面積,且將其定義為虛函數(shù)。上一頁下一頁返回任務(wù)3虛函數(shù)上一頁下一頁返回任務(wù)3虛函數(shù)定義Circle類,包含1個數(shù)據(jù)成員:,表示圓心的半徑,數(shù)據(jù)類型為int;包含成員函數(shù)ar-ea()表示求圓的面積,類Circle繼承類Point上一頁下一頁返回任務(wù)3虛函數(shù)上一頁下一頁返回任務(wù)3虛函數(shù)上一頁下一頁返回任務(wù)3虛函數(shù)實(shí)例化一個Point類的對象和一個Circle類的對象,先各自調(diào)用各自的area()函數(shù),然后將Cir
12、cle類對象的指針賦給一個指向Point類的指針,再次調(diào)用area()函數(shù),比較結(jié)果。上一頁下一頁返回任務(wù)3虛函數(shù)程序執(zhí)行結(jié)果如下:點(diǎn)的面積為0.圓的面積為:113. 094在本例中,盡管PP是指向Point的指針,但是PP一area()執(zhí)行的卻是Circle. area(),而不是Point. area()。這說明虛函數(shù)的執(zhí)行是動態(tài)聯(lián)編的,即在程序運(yùn)行時進(jìn)行關(guān)聯(lián)或束定。動態(tài)聯(lián)編只能通過指針或引用標(biāo)識對象來操作虛函數(shù)。如果派生的類中沒有對基類中的虛函數(shù)進(jìn)行重新定義,則它繼承基類中的虛函數(shù)。上一頁下一頁返回任務(wù)3虛函數(shù)上一頁下一頁返回任務(wù)3虛函數(shù)上一頁下一頁返回任務(wù)3虛函數(shù)上一頁下一頁返回任務(wù)3
13、虛函數(shù)上一頁下一頁返回任務(wù)3虛函數(shù)上一頁下一頁返回任務(wù)3虛函數(shù)上一頁下一頁返回任務(wù)3虛函數(shù)上一頁下一頁返回任務(wù)3虛函數(shù)上一頁下一頁返回任務(wù)3虛函數(shù)執(zhí)行結(jié)果:大學(xué)生收費(fèi)學(xué)號:1娃名:下艷學(xué)費(fèi):4800住宿費(fèi):1100書報費(fèi):400其他:200總費(fèi)用:6500上一頁下一頁返回任務(wù)3虛函數(shù)研究生收費(fèi)學(xué)縣:120娃名:張軍住宿費(fèi):1100書報費(fèi):400其他:200總費(fèi)用:1700上一頁下一頁返回任務(wù)3虛函數(shù)這時我們看到程序執(zhí)行正確了,而本程序與例9-2的惟一差別是將student類的calfee()和disp()兩個成員函數(shù)設(shè)置為虛函數(shù)。編譯通常是在先前聯(lián)編狀態(tài)下工作的,只有看見虛函數(shù),才把它作為動態(tài)
14、聯(lián)編來實(shí)現(xiàn)。9. 3. 2 純虛函數(shù)與抽象類在定義一個表達(dá)抽象概念的基類時,有時可能會無法給出某些成員函數(shù)的具體實(shí)現(xiàn)。這時,就可以將這些函數(shù)聲明為純虛函數(shù)。 純虛函數(shù)的聲明如下(注:要放在基類的定義體中): virtual函數(shù)原型=(); 其中:函數(shù)原型的格式與前面所學(xué)的格式一樣,要包括函數(shù)返回值的類型、函數(shù)名、圓括號、形參及其類型等。上一頁下一頁返回任務(wù)3虛函數(shù)由此可看出,純虛函數(shù)是只在基類中聲明虛函數(shù)但未給出具體的函數(shù)定義體。因此,從帶有純虛函數(shù)的基類中派生出的派生類,都必須定義自己的、與純虛函數(shù)同名的重載函數(shù),也就是將它的具體定義放在各派生類中,我們把這種虛函數(shù)稱為純虛函數(shù)。通過該基類的
15、指針或引用就可以調(diào)用所有派生類的虛函數(shù),而基類只是用于繼承,僅作為一個接日,具體功能在派生類中實(shí)現(xiàn)。 聲明了純虛函數(shù)的類,稱為抽象類。 使用純虛函數(shù)與抽象類時應(yīng)注意以下幾點(diǎn)。 (1)不能聲明抽象類的對象,但可以聲明指向抽象類的指針變量和引用變量。也就是說,抽象類只能用作基類來派生新類,而不能用來創(chuàng)建對象。上一頁下一頁返回任務(wù)3虛函數(shù)(2)抽象類中可以有多個純虛函數(shù)。 (3)抽象類一也可以定義其他非純虛函數(shù)。 (4)如果在派生類中沒有重新定義基類中的純虛函數(shù),則必須再將該虛函數(shù)聲明為純虛函數(shù),這時,這個派生類仍然是一個抽象類;如果在派生類中給出了所有純虛函數(shù)的具體實(shí)現(xiàn),則該派生類就不再是抽象類。 (5)從抽象類可以派生出具體類或抽象類,但不能從具體類派生出抽象類。 (6)在一個復(fù)雜的類繼承結(jié)構(gòu)中,越上層的類抽象程度就越高,有時甚至無法給出某些成員函數(shù)的具體實(shí)現(xiàn)。顯然,抽象類是一種特殊的類,它一般處于類繼承結(jié)構(gòu)的較外層。上一頁下一頁返回任務(wù)3虛函數(shù)()引人抽象類的日的主要是為了能將相關(guān)類組織在一個類繼承結(jié)構(gòu)中,并通過抽象類來為這些相關(guān)類提供統(tǒng)一的操作接日。 【例9-5】設(shè)計(jì)一個抽象類S
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度鍋爐設(shè)備定期維護(hù)保養(yǎng)與安全檢查合同
- 銅陵2025年安徽銅陵市公安局警務(wù)輔助人員招聘112人筆試歷年參考題庫附帶答案詳解
- 貴州2025年貴州農(nóng)業(yè)職業(yè)學(xué)院招聘29人筆試歷年參考題庫附帶答案詳解
- 莆田2025年福建莆田市仙游縣事業(yè)單位高層次人才招聘10人筆試歷年參考題庫附帶答案詳解
- 肇慶2025年廣東肇慶懷集縣招聘鄉(xiāng)村公益性崗位工作人員111人筆試歷年參考題庫附帶答案詳解
- 江蘇中國中煤能源集團(tuán)有限公司江蘇分公司2025屆高校畢業(yè)生第二次招聘6人筆試歷年參考題庫附帶答案詳解
- 2025年中國天門冬素市場調(diào)查研究報告
- 2025年中國冰棍市場調(diào)查研究報告
- 2025至2031年中國高壓氣動注油器行業(yè)投資前景及策略咨詢研究報告
- 2025至2031年中國醇基綠色涂料行業(yè)投資前景及策略咨詢研究報告
- 裝修工程延期協(xié)議
- 2025-2030全球21700圓柱形鋰離子電池行業(yè)調(diào)研及趨勢分析報告
- 2025-2025年教科版小學(xué)科學(xué)三年級下冊科學(xué)教學(xué)計(jì)劃
- 2025年云南中煙工業(yè)限責(zé)任公司招聘24人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025云南昆明空港投資開發(fā)集團(tuán)招聘7人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 《大健康解讀》課件
- 2024-2025學(xué)年成都市樹德東馬棚七年級上英語期末考試題(含答案)
- 部編(統(tǒng)編)版語文+四下第四單元教材解讀課件
- 年產(chǎn)10噸功能益生菌凍干粉的工廠設(shè)計(jì)改
- 成都嘉祥外國語學(xué)校獎學(xué)金考試數(shù)學(xué)試卷
- 臺球俱樂部助教制度及待遇
評論
0/150
提交評論