《面向?qū)ο蟪绦蛟O(shè)計》講義.ppt
《《面向?qū)ο蟪绦蛟O(shè)計》講義.ppt》由會員分享,可在線閱讀,更多相關(guān)《《面向?qū)ο蟪绦蛟O(shè)計》講義.ppt(38頁珍藏版)》請在裝配圖網(wǎng)上搜索。
面向?qū)ο蟪绦蛟O(shè)計 講義 第12章 12 1多態(tài)性在C 中的體現(xiàn)所謂多態(tài)性就是當(dāng)不同對象收到相同的消息時產(chǎn)生不同的動作 12 1 1編譯時的多態(tài)性1 在一個類中說明的重載2 基類成員函數(shù)在派生類中重載12 1 2運行時的多態(tài)性先看下面的例子 第12章多態(tài)性與虛函數(shù) include includeclasspoint protected intx y public point intx inty point x x point y y virtualvoidshow 定義虛函數(shù) putpixel x y getcolor classcircles publicpoint intradius public circles intx inty intradius point x y circles radius radius voidshow circles x y radius main pointp1 10 10 circlesc1 100 100 50 setcolor 14 point ptr 定義指向基類的指針ptr 調(diào)用c1對象的show 12 2虛函數(shù)12 2 1對象指針1 一般對象的指針語法與指向一般變量的指針相同 2 引入派生類后的對象指針任何被說明為指向基類的指針都可以指向它的公有派生類 使用派生類對象指針時應(yīng)注意的問題 1 可以用一個聲明讓指向基類對象的指針指向它的公有派生的對象 禁止指向私有派生的對象 2 不能將一個聲明為指向派生類對象的指針指向其基類的一個對象 3 聲明為指向基類對象的指針 當(dāng)其指向派生類對象時 只能利用它來直接訪問派生類中從基類繼承來的成員 不能訪問公有派生類中特定的成員 12 2 2為什么要引入虛函數(shù) includeclassbase public voidwho cout thisistheclassofbase n classderive1 publicbase public voidwho cout thisistheclassofderive1 n classderive2 publicbase public voidwho cout thisistheclassofderive2 n main baseobj1 p derive1obj2 derive2obj3 p 運行結(jié)果 thisistheclassofbase thisistheclassofbase thisistheclassofbase thisistheclassofderive1 thisistheclassofderive2 從結(jié)果可以看出 通過指針引起的普通成員函數(shù)調(diào)用 僅僅與指針的類型有關(guān) 而與此刻正指向什么對象無關(guān) 12 2 3虛函數(shù)的定義及使用1 虛函數(shù)的定義 includeclassbase public virtualvoidwho 定義虛函數(shù) cout base n classfrist publicbase public voidwho 重新定義虛函數(shù) cout thefirstderivation n classsecond publicbase public voidwho 重新定義虛函數(shù) coutwho 調(diào)用base類的who 版本 ptr 調(diào)用second類的who 版本 運行結(jié)果 basethefirstderivationthesecondderivation 2 虛函數(shù)與重載函數(shù)的關(guān)系3 多繼承中的虛函數(shù) includeclassa public virtualvoidf 定義f 為虛函數(shù) cout classa n classb public voidf 定義f 為一般函數(shù) cout classb n classaa publica publicb public voidf coutf 調(diào)用a類的f ptr2 調(diào)用b類的f ptr1 調(diào)用b類的f 此處f 為非虛函數(shù) 而ptr2 又為b的指針 運行結(jié)果 classaclassbclassaaclassb 若一個派生類 它的多個基類中有公共的基類 在公共基類中定義一個虛函數(shù) 則多級派生以后仍可以重新定義虛函數(shù) 使用級聯(lián)式派生時要注意 指向派生類的指針不能繼承 也就是說 基類的指針可以指向它的派生類 但不能再指向它的派生類的派生類 4 基類構(gòu)造函數(shù)調(diào)用虛函數(shù)自學(xué) 12 2 4虛函數(shù)舉例例3 include pragmahdrstop include U12 2 4 3 h pragmapackage smart init pragmaresource dfm Tf12 2 4 3 f12 2 4 3 enumbool false true structelement 定義鏈表中的結(jié)點結(jié)構(gòu)intval element next classlist 定義鏈表類element elems public list elems 0 list virtualboolinsert int 定義虛函數(shù)virtualbooldeletes int 定義虛函數(shù)boolcontain int voidprint classset publiclist intcard public set card 0 boolinsert int 重定義虛函數(shù)booldeletes int 重定義虛函數(shù) list list element tmp elems for element elem elems elem 0 tmp elem elem elem next deletetmp boollist insert intval 定義list類中插入元素的成員函數(shù) element elem newelement 為新元素分配內(nèi)存if elem 0 elem val val 將元素插入鏈表頭elem next elems elems elem returntrue elsereturnfalse boollist deletes intval 定義list類中刪除元素的成員函數(shù) if elems 0 returnfalse 若表為空 返回falseelement tmp elems if elems val val 若待刪除的元素為鏈表頭元素elems elems next deletetmp returntrue else for element elem elems elem next 0 elem next if elem next val val 循環(huán)查找待刪除元素tmp elem next elem next tmp next deletetmp returntrue returnfalse boollist contain intval 判元素val在鏈表中是否存在if elems 0 returnfalse if elems val val returntrue elsefor element elem elems elem next 0 elem elem next if elem next val val returntrue returnfalse voidlist print if elems 0 return inti 1 staticintj 0 j for element elem elems elem 0 elem elem next f12 2 4 3 Canvas TextOut 30 i 20 j IntToStr elem val boolset insert intval 在set類中的insert的重定義版本if contain val boolset deletes intval 在set類中的deletes重定義版本if list deletes val 調(diào)用基類中的此函數(shù)版本 card returntrue returnfalse fastcallTf12 2 4 3 Tf12 2 4 3 TComponent Owner TForm Owner void fastcallTf12 2 4 3 btnRunClick TObject Sender list ptr list1 定義基類對象list1和基類指針ptrsetset1 定義set類對象ptr ptr insert 456 ptr insert 23 ptr print 調(diào)用list類中的成員函數(shù) void fastcallTf12 2 4 3 btnEndClick TObject Sender Close 12 3抽象類12 3 1純虛函數(shù)與抽象類1 純虛函數(shù)的概念定義形式 virtualtypefunc name 參數(shù)表 0 注意事項 在基類中定義為純虛函數(shù)的函數(shù) 在任何派生類中都必須定義自己的版本 否則將引起語法錯誤 2 抽象類的概念如果類中至少有一個純虛函數(shù) 那么就稱該類為抽象類 使用抽象類的幾點規(guī)定 1 抽象類只能用作其它類的基類 不能建立抽象類對象 2 抽象類不能用作參數(shù)類型 函數(shù)返回類型或顯式轉(zhuǎn)換的類型 3 可以聲明指向抽象類的指針和引用 此指針可以指向它的派生類 進而實現(xiàn)多態(tài)性 舉例說明如下 classfigure public virtualdraw 0 figurea 錯誤 不能建立抽象類對象figure ptr 正確 可以聲明指向抽象類的指針figuref 錯誤 抽象類不能作為函數(shù)的返回類型voidg figure 錯誤 抽象類不能作為函數(shù)的參數(shù)類型figure 正確 可以聲明抽象類的引用 12 3 2純虛函數(shù)多態(tài)性的體現(xiàn)例2 includeclasscontainer 定義一個抽象類protected doubleradius public container doubleradius container radius radius virtualdoublesurface area 0 純虛函數(shù)virtualdoublevolume 0 純虛函數(shù) classcube publiccontainer 定義正方體類public cube doubleradius container radius doublesurface area 虛函數(shù)在本類中的定義版本doublevolume classsphere publiccontainer 定義球體類public sphere doubleradius container radius doublesurface area 虛函數(shù)在本類中的定義版本doublevolume classcylinder publiccontainer 定義圓柱體類doubleheight public cylinder doubleradius doubleheight container radius cylinder height height doublesurface area 虛函數(shù)在本類中的定義版本doublevolume doublecube doublesurface area return radius radius 6 doublecube volume return radius radius radius doublesphere doublesurface area return4 3 1416 radius radius doublesphere volume return3 1416 radius radius radius 4 3 doublecylinder doublesurface area return3 1416 2 radius height radius doublecylinder volume return3 1416 radius radius height main container ptr cubeobj1 5 sphereobj2 5 cylinderobj3 5 5 ptr- 1.請仔細閱讀文檔,確保文檔完整性,對于不預(yù)覽、不比對內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請點此認領(lǐng)!既往收益都歸您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁顯示word圖標(biāo),表示該PPT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國旗、國徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計者僅對作品中獨創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 面向?qū)ο蟪绦蛟O(shè)計 面向 對象 程序設(shè)計 講義
鏈接地址:http://www.3dchina-expo.com/p-8313184.html