第十七章 多態(tài) 對(duì)象獨(dú)立性_第1頁(yè)
第十七章 多態(tài) 對(duì)象獨(dú)立性_第2頁(yè)
第十七章 多態(tài) 對(duì)象獨(dú)立性_第3頁(yè)
全文預(yù)覽已結(jié)束

下載本文檔

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

文檔簡(jiǎn)介

1、第十七章 多態(tài) 對(duì)象獨(dú)立性1、什么是多態(tài)1.1 什么是多態(tài)一個(gè)動(dòng)作具有不同的含義例如:籃球比賽中,教練下達(dá)“防守”命令,中鋒和后衛(wèi)的防守位置和動(dòng)作各不相同;軍訓(xùn)中,教官下達(dá)“集合”命令,每個(gè)人站的位置各不相同。 2、C+中的多態(tài)2.1 多態(tài)的實(shí)現(xiàn)方式靜態(tài)綁定(static binding) 動(dòng)態(tài)綁定(dynamic binding)1 2.2 靜態(tài)綁定一個(gè)類(lèi)存在同名函數(shù),它們可以根據(jù)參數(shù)類(lèi)型、參數(shù)個(gè)數(shù)、參數(shù)順序加以區(qū)別(函數(shù)重載)例如:void print_arr(int * arr, int n); (1) void print_arr(double * arr, int n); (2) 靜

2、態(tài)綁定的特點(diǎn)在編譯階段就可以確定調(diào)用哪個(gè)函數(shù)例如:void main () int a = 1,2,3; double b = 1.1,2.2; print_arr(a, 3); /編譯階段即可確定調(diào)用函數(shù)(1) print_arr(b, 2); /編譯階段即可確定調(diào)用函數(shù)(2)2.3 動(dòng)態(tài)綁定定義在一個(gè)類(lèi)層次中的不同類(lèi)的函數(shù),他們具有相同名字和參數(shù),根據(jù)指針指向的對(duì)象所在類(lèi)來(lái)確定調(diào)用的函數(shù)。1 動(dòng)態(tài)方式的特點(diǎn)只有當(dāng)程序運(yùn)行時(shí)才能確定調(diào)用哪個(gè)函數(shù)(運(yùn)行期綁定)3.1 任務(wù)的提出設(shè)計(jì)一款游戲,玩家下達(dá)“攻擊”命令后,己方步兵、坦克兵等向指定位置進(jìn)行移動(dòng)。3.2 設(shè)計(jì)士兵相關(guān)的類(lèi)步兵、坦克兵都是士

3、兵的一種,因此可以將士兵設(shè)計(jì)為基類(lèi),步兵和坦克兵設(shè)計(jì)為士兵的派生類(lèi)。class soldier /士兵類(lèi)public:void move() /士兵移動(dòng) cout << “士兵移動(dòng) " <<endl; ;class tanker: public soldier /坦克兵類(lèi)public: void move() cout << "開(kāi)坦克移動(dòng) " <<endl;class foot_soldier : public soldier /步兵類(lèi)public:void move() cout << "兩條

4、腿移動(dòng)" <<endl;1 3.3 設(shè)計(jì)攻擊函數(shù)void attack (tanker * pt) /坦克兵發(fā)起攻擊 pt->move(); void attack (foot_soldier * pb) /步兵發(fā)起攻擊pb->move();3.4 玩家下發(fā)攻擊指令void main()tanker t;foot_soldier f;attack(&t); /打印”開(kāi)坦克移動(dòng)”attack(&f); /打印”靠?jī)蓷l腿移動(dòng)”3.5 問(wèn)題的提出開(kāi)發(fā)人員A負(fù)責(zé)維護(hù)攻擊函數(shù),A的問(wèn)題是:坦克兵和步兵既然都是士兵,能否將現(xiàn)有的兩個(gè)函數(shù)合并為以下一個(gè)函數(shù)?

5、void attack (soldier * ps) ps->move();如果通過(guò)基類(lèi)指針ps可以訪(fǎng)問(wèn)派生類(lèi)對(duì)象該多么方便:當(dāng)ps指向坦克對(duì)象,則調(diào)用坦克類(lèi)的move();當(dāng)ps指向步兵對(duì)象,則調(diào)用步兵類(lèi)的move();3、為什么需要多態(tài)開(kāi)發(fā)人員A希望獲得如下效果:void main()tanker t;foot_soldier f;attack(&t); / 期望打印”開(kāi)坦克移動(dòng)”attack(&f); / 期望打印“靠?jī)蓷l腿移動(dòng)”但實(shí)際結(jié)果是:士兵移動(dòng)士兵移動(dòng)1 3.6 問(wèn)題原因foot_soldier f 的內(nèi)存布局:soldier * ps;foot_soldi

6、er f;ps = &f;ps->move();/ps是基類(lèi)的指針,調(diào)用的是基類(lèi)的move() 3.6 問(wèn)題的解決使用虛函數(shù)在基類(lèi)的函數(shù)前加上virtual關(guān)鍵字:class soldier /士兵類(lèi)public: virtual void move() cout << “soldier move " <<endl; ;使用虛函數(shù)后,對(duì)象f的內(nèi)存布局:派生類(lèi)的move覆蓋了基類(lèi)的movesoldier * ps;foot_soldier f;ps = &f;ps->move();/ps調(diào)用的是foot_soldier:move()

7、3.7 使用虛函數(shù)的好處void attack (soldier * ps) ps->move();/通過(guò)基類(lèi)指針就可以調(diào)用派生類(lèi)的move 開(kāi)發(fā)人員A只需專(zhuān)注于attack()流程的設(shè)計(jì),至于坦克兵和步兵的move()如何實(shí)現(xiàn)則完全不用操心,甚至不關(guān)心誰(shuí)會(huì)調(diào)用attack()。3.8 C+實(shí)現(xiàn)多態(tài)的方法通過(guò)基類(lèi)指針調(diào)用虛函數(shù)。如: soldier * ps; tanker t; foot_soldier f; ps = & t; ps->move(); /調(diào)用tanker:move() ps = & f; ps->move(); /調(diào)用foot_soldie

8、r:move()5、抽象類(lèi)和純虛函數(shù)5.1 問(wèn)題的提出玩家通過(guò)“兵工廠(chǎng)”創(chuàng)造出的士兵不應(yīng)該是soldier類(lèi)的對(duì)象,只能是tanker類(lèi)或foot_soldier類(lèi)的對(duì)象,否則:soldier s;s.move();這個(gè)士兵到底是開(kāi)坦克走還是靠?jī)蓷l腿走?5.2 解決之道-將soldier類(lèi)改為抽象類(lèi)class soldier /士兵類(lèi)public:virtual void move() = 0; /士兵移動(dòng);5.2 什么是純虛函數(shù)(pure virtual function)virtual void move() = 0; 說(shuō)明:1、語(yǔ)法格式: virtual 函數(shù)類(lèi)型 函數(shù)名稱(chēng)(參數(shù)列表)

9、= 0;2、作用通知編譯器,move的函數(shù)體只能由soldier的派生定義, soldier類(lèi)不能定義move的函數(shù)體。3、特點(diǎn)包含虛函數(shù)的類(lèi)無(wú)法創(chuàng)建對(duì)象(實(shí)例化)1 5.3 什么是抽象類(lèi)(abstract class)包含純虛函數(shù)的類(lèi)稱(chēng)為抽象類(lèi)soldier類(lèi)定義為抽象類(lèi)后有如下效果:soldier s;編譯代碼時(shí)報(bào)如下錯(cuò)誤:'soldier' : cannot instantiate abstract class due to following members5.4 為什么需要抽象類(lèi)soldier類(lèi)的move()無(wú)法確定行動(dòng)的方式,只能由soldier類(lèi)的派生類(lèi)確定。練習(xí)

10、class base public :virtual void xfun()cout <<"base: xfun"<< endl;void yfun() cout << "base:yfun" << endl;class derived: public basepublic:void xfun()cout << "derived:xfun" << endl;void yfun()cout << "deri:yfun" <<endl;void main() /程序的執(zhí)行結(jié)果是什么? base

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論