編程技術(shù)中多態(tài)性分析_第1頁
編程技術(shù)中多態(tài)性分析_第2頁
編程技術(shù)中多態(tài)性分析_第3頁
編程技術(shù)中多態(tài)性分析_第4頁
編程技術(shù)中多態(tài)性分析_第5頁
已閱讀5頁,還剩2頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、面向?qū)ο缶幊讨械亩鄳B(tài)性-季松華【基于c+ , java概念上基本完全一樣,只是在實(shí)現(xiàn)上有些細(xì)微差別基本數(shù)據(jù)類型:整數(shù)、浮點(diǎn)數(shù)、字符等運(yùn)算符:加減乘除等】目前,面向?qū)ο缶幊谭浅5牧餍?,面向?qū)ο缶幊逃腥筇卣?,分別是 封裝、繼承和多態(tài)性本課堂主要討論多態(tài)性什么是多態(tài)性?一:多態(tài)性定義多態(tài)性,按字面理解就是多種形狀,比如有生物多態(tài)性,基因多態(tài)性等等計(jì)算機(jī)編程中的定義:相同的方法調(diào)用可實(shí)現(xiàn)不同的實(shí)現(xiàn)方式,簡(jiǎn)單點(diǎn)說就是“一個(gè)接口,多種方法”舉一個(gè)例子,計(jì)算機(jī)硬件里面的輸入輸出設(shè)備,我們統(tǒng)稱為I/O設(shè)備,而具體的設(shè)備實(shí)體 輸入的有鍵盤、鼠標(biāo)、掃描儀等等,輸出的有顯示器、打印機(jī)、音響等等,這個(gè)例子中的I/O

2、設(shè)備就是一個(gè)統(tǒng)一的接口,而鍵盤、顯示器呢就是具體的實(shí)現(xiàn),(堆??梢源鎯?chǔ)各種格式的數(shù)據(jù),包括整型,浮點(diǎn)或字符。不管存儲(chǔ)的是何種數(shù)據(jù),堆棧的算法實(shí)現(xiàn)是一樣的。 針對(duì)不同的數(shù)據(jù)類型, 編程人員不必手工選擇,只需使用統(tǒng)一接口名,系統(tǒng)可自動(dòng)選擇。)下面討論多態(tài)性在我們編程中的表現(xiàn)形式二:多態(tài)性表現(xiàn)形式:主要有以下4中:強(qiáng)制多態(tài)、重載多態(tài)、類型參數(shù)化(模板)多態(tài)以及包含多態(tài)強(qiáng)制多態(tài)性:強(qiáng)制是指兩種不同的數(shù)據(jù)類型進(jìn)行轉(zhuǎn)換的一種語義操作;程序設(shè)計(jì)語言中基本數(shù)據(jù)類型的大多數(shù)操作符,在發(fā)生不同類型的數(shù)據(jù)之間混合運(yùn)算時(shí),-般都會(huì)進(jìn)行強(qiáng)制類型轉(zhuǎn)換,以符合函數(shù)或操作符的要求,即隱式的轉(zhuǎn)換程序員也可以顯示的進(jìn)行強(qiáng)制操作,

3、即顯示的轉(zhuǎn)換比如說整形與浮點(diǎn)型相加,3+3.14通過轉(zhuǎn)換,實(shí)現(xiàn)了一個(gè)接口(某種數(shù)據(jù)類型)多種實(shí)現(xiàn)(多種數(shù)據(jù)類型)重載多態(tài)性:重載包括運(yùn)算符重載和函數(shù)重載,編譯系統(tǒng)根據(jù)參數(shù)類型及個(gè)數(shù)的最佳匹配,自動(dòng)確定調(diào)用哪一個(gè)函數(shù),就是函數(shù)重載,相應(yīng)的,對(duì)于已有的運(yùn)算符賦予多重含義,使得同一個(gè)運(yùn)算符作用于不同的數(shù)據(jù)時(shí),產(chǎn)生不同的行為,就是運(yùn)算符重載運(yùn)算符重載:有兩種,一種是重載為類的成員函數(shù),一種是重載為類的友元函數(shù),面向?qū)ο缶幊讨杏幸粋€(gè)很重要的概念,類,類的實(shí)例就是對(duì)象,在進(jìn)行對(duì)象與基本數(shù)據(jù)類型它們之運(yùn)算的時(shí)候,常常需要進(jìn)行操作符重載,為什么?基本數(shù)據(jù)類型都是已經(jīng)定義好的,間的運(yùn)算都是可以預(yù)知的,比如一個(gè)整

4、數(shù)與浮點(diǎn)數(shù)相加3+3.14 ,結(jié)果可不可以預(yù)知?可以的,系統(tǒng)能知道應(yīng)該產(chǎn)生什么樣的結(jié)果6.14吧而一個(gè)對(duì)象與對(duì)象相加或者一個(gè)對(duì)象與一個(gè)基本數(shù)據(jù)類型相加,系統(tǒng)能知道應(yīng)該產(chǎn)生什么樣的結(jié)果嗎?比如“人”這樣一個(gè)對(duì)象與整數(shù) 3相加,你能知道是年齡加 3呢還是身高加3?不知道的,所以要進(jìn)行運(yùn)算符重載,那么你可以重載為年齡加3而不是身高加3通過這種方法,就為“加法運(yùn)算”這一種接口符實(shí)現(xiàn)了不同的行為函數(shù)重載:允許功能相近的的函數(shù)在相同的作用域內(nèi)同名定義,這樣就比較方便記憶, 便于使用,程序設(shè)計(jì)也就更加靈活函數(shù)重載,就是同名函數(shù),函數(shù)名字相同,參數(shù)類型不同或者個(gè)數(shù)不同或者兩者都不同C語言中沒有函數(shù)重載這個(gè)概念

5、,c+/java中有,舉一個(gè)例子,實(shí)現(xiàn)加法運(yùn)算的函數(shù),取名為sum,帶兩個(gè)參數(shù)可以是兩個(gè)整形,浮點(diǎn)型,字符串這就是多態(tài)性的表現(xiàn),一種接口,多種方法類型參數(shù)化多態(tài):有模板函數(shù),模板類;當(dāng)一個(gè)函數(shù)(類)統(tǒng)一的對(duì)若干類型參數(shù)操作,這 些類型又表現(xiàn)出某些公共的語義特性時(shí),就可以用模版函數(shù)或模板類來描述。這就是參數(shù)類型多態(tài)。模板函數(shù)、模版類的定義方法參考相關(guān)的書籍,本處不再贅述?!灸0婧瘮?shù)Template T add ( T a, T b )Return a+b;)模板類Template Class A T j;Public:A(T a) j = a; );卜模板技術(shù)的多態(tài)性是最好理解的,也稱為最純的多

6、態(tài)一個(gè)模板就是一個(gè)接口,通過對(duì)模板的演化,就可以產(chǎn)生許許多多的具體的實(shí)現(xiàn)方法需要注意的是:在類型參數(shù)化多態(tài)中,一個(gè)多態(tài)函數(shù)(類)必須至少帶一個(gè)類型參數(shù),該類型參數(shù)確定函數(shù)(類)在每次執(zhí)行時(shí)操作數(shù)的類型,包含多態(tài):基礎(chǔ)是繼承和虛函數(shù), 也是常說的面向?qū)ο缶幊讨械牡亩鄳B(tài)技術(shù),虛函數(shù)是引入了派生概念后,用來表現(xiàn)基類和派生類的成員函數(shù)之間的一種關(guān)系的,其為C+語言提供了靈活的多態(tài)實(shí)現(xiàn)機(jī)制,虛函數(shù)在基類中定義,需要定義為虛函數(shù)的成員函數(shù)在其聲明中加上關(guān)鍵字virtual,舉一個(gè)例子 父類 汽車,有一個(gè)接口方法:駕駛,派生類 卡車,小轎車,分別實(shí)現(xiàn)了各自的駕駛方法好,現(xiàn)在,定義一個(gè)父類汽車的指針 (或引用

7、),當(dāng)該指針(或引用)對(duì)應(yīng)于卡車時(shí),駕駛表現(xiàn)的是卡車的駕駛技術(shù),當(dāng)該指針(或引用)對(duì)應(yīng)于小轎車時(shí),駕駛表現(xiàn)的是小轎車的駕駛技術(shù),大家知道,小轎車是拿的是 c照,卡車可能就是 A照了,對(duì)于駕駛技術(shù)的要求是不同的,即一個(gè)接口,多種方法多態(tài)性剛才,討論了多態(tài)性的表現(xiàn)形式,下面談一下多態(tài)性的實(shí)現(xiàn)細(xì)節(jié)三:多態(tài)性的實(shí)現(xiàn)細(xì)節(jié):分為兩種:靜態(tài)綁定技術(shù):在生成可執(zhí)行代碼之前, 在編譯程序時(shí),由編譯器決定使用某種具體的實(shí)現(xiàn),比如強(qiáng)制、重載、類型參數(shù)化,強(qiáng)制:類型轉(zhuǎn)換在編譯時(shí)就已經(jīng)完成重載:函數(shù)名在調(diào)用時(shí)相同, 在底層是不同的,編譯時(shí)會(huì)根據(jù)參數(shù)的不同重新生成不同的函數(shù)名類型參數(shù)化:模版不能直接使用,需要進(jìn)行演化,就

8、是生成各種具體的函數(shù)或類,都屬于這一種技術(shù),也稱為靜態(tài)多態(tài)動(dòng)態(tài)綁定技術(shù):運(yùn)行時(shí)決定,也稱為動(dòng)態(tài)多態(tài)比如前面所說的包含多態(tài)就是這種動(dòng)態(tài)多態(tài)如何實(shí)現(xiàn)?當(dāng)我們實(shí)例化對(duì)象的時(shí)候會(huì),系統(tǒng)會(huì)為該對(duì)象分配內(nèi)存, 含有虛函數(shù)的對(duì)象的內(nèi)存會(huì)比不含有虛函數(shù)的對(duì)象多 4個(gè)字節(jié),即一個(gè)指針 的大小,該指針被稱為 虛指針【每個(gè)含有虛函數(shù)的類,實(shí)例化對(duì)象時(shí),內(nèi)存中會(huì)額外分配4個(gè)字節(jié),保存一個(gè)虛指針(vptr),該虛指針指向一張?zhí)摵瘮?shù)表(vtbl),表中每一項(xiàng)是一個(gè)虛函數(shù)的地址,也就是說,虛函數(shù)表的每一項(xiàng)是一個(gè)虛函數(shù)的指針。沒有虛函數(shù)的C+類,是不會(huì)有虛函數(shù)表的。兩張圖:Chssl構(gòu)件寅腑仃3b上a*!t;unc);.:二

9、二工:vfunci I); :一!- vfunc2 (); v i 11 l vfunc3();A Cktssl二vfUnelOA Classi: Ali.mc 20A Class 30C la5sl nieiiifimcO-1)0/vfbiKZX)Clais2,忤俄的比如,父類汽車的指針(或引用),運(yùn)行時(shí)獲得小轎車對(duì)象內(nèi)存,當(dāng)調(diào)用方法駕駛時(shí),就會(huì)通過小轎車的虛指針找到小轎車對(duì)應(yīng)的虛函數(shù)表,然后在表里查找駕駛這個(gè)方法,并調(diào)用該方法,于是,表現(xiàn)出來就是小轎車的駕駛可以看出,真正跟面向?qū)ο缶幊逃忻芮新?lián)系的多態(tài)性是包含多態(tài)四:總結(jié): 通過前面的分析,可以看到,進(jìn)行抽象(類型轉(zhuǎn)換,重載等程序員在編寫代碼的時(shí)候,往往需要對(duì)一些具有共性的東西,等,只是層次不一樣),使之變成一個(gè)統(tǒng)一的接

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論