《面向?qū)ο蟪绦蛟O(shè)計(jì)》講義.ppt
《《面向?qū)ο蟪绦蛟O(shè)計(jì)》講義.ppt》由會(huì)員分享,可在線(xiàn)閱讀,更多相關(guān)《《面向?qū)ο蟪绦蛟O(shè)計(jì)》講義.ppt(38頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
面向?qū)ο蟪绦蛟O(shè)計(jì) 講義 第12章 12 1多態(tài)性在C 中的體現(xiàn)所謂多態(tài)性就是當(dāng)不同對(duì)象收到相同的消息時(shí)產(chǎn)生不同的動(dòng)作 12 1 1編譯時(shí)的多態(tài)性1 在一個(gè)類(lèi)中說(shuō)明的重載2 基類(lèi)成員函數(shù)在派生類(lèi)中重載12 1 2運(yùn)行時(shí)的多態(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 定義指向基類(lèi)的指針ptr 調(diào)用c1對(duì)象的show 12 2虛函數(shù)12 2 1對(duì)象指針1 一般對(duì)象的指針語(yǔ)法與指向一般變量的指針相同 2 引入派生類(lèi)后的對(duì)象指針任何被說(shuō)明為指向基類(lèi)的指針都可以指向它的公有派生類(lèi) 使用派生類(lèi)對(duì)象指針時(shí)應(yīng)注意的問(wèn)題 1 可以用一個(gè)聲明讓指向基類(lèi)對(duì)象的指針指向它的公有派生的對(duì)象 禁止指向私有派生的對(duì)象 2 不能將一個(gè)聲明為指向派生類(lèi)對(duì)象的指針指向其基類(lèi)的一個(gè)對(duì)象 3 聲明為指向基類(lèi)對(duì)象的指針 當(dāng)其指向派生類(lèi)對(duì)象時(shí) 只能利用它來(lái)直接訪(fǎng)問(wèn)派生類(lèi)中從基類(lèi)繼承來(lái)的成員 不能訪(fǎng)問(wèn)公有派生類(lèi)中特定的成員 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 運(yùn)行結(jié)果 thisistheclassofbase thisistheclassofbase thisistheclassofbase thisistheclassofderive1 thisistheclassofderive2 從結(jié)果可以看出 通過(guò)指針引起的普通成員函數(shù)調(diào)用 僅僅與指針的類(lèi)型有關(guān) 而與此刻正指向什么對(duì)象無(wú)關(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類(lèi)的who 版本 ptr 調(diào)用second類(lèi)的who 版本 運(yùn)行結(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類(lèi)的f ptr2 調(diào)用b類(lèi)的f ptr1 調(diào)用b類(lèi)的f 此處f 為非虛函數(shù) 而ptr2 又為b的指針 運(yùn)行結(jié)果 classaclassbclassaaclassb 若一個(gè)派生類(lèi) 它的多個(gè)基類(lèi)中有公共的基類(lèi) 在公共基類(lèi)中定義一個(gè)虛函數(shù) 則多級(jí)派生以后仍可以重新定義虛函數(shù) 使用級(jí)聯(lián)式派生時(shí)要注意 指向派生類(lèi)的指針不能繼承 也就是說(shuō) 基類(lèi)的指針可以指向它的派生類(lèi) 但不能再指向它的派生類(lèi)的派生類(lèi) 4 基類(lèi)構(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é)點(diǎn)結(jié)構(gòu)intval element next classlist 定義鏈表類(lèi)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類(lèi)中插入元素的成員函數(shù) element elem newelement 為新元素分配內(nèi)存if elem 0 elem val val 將元素插入鏈表頭elem next elems elems elem returntrue elsereturnfalse boollist deletes intval 定義list類(lèi)中刪除元素的成員函數(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類(lèi)中的insert的重定義版本if contain val boolset deletes intval 在set類(lèi)中的deletes重定義版本if list deletes val 調(diào)用基類(lèi)中的此函數(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 定義基類(lèi)對(duì)象list1和基類(lèi)指針ptrsetset1 定義set類(lèi)對(duì)象ptr ptr insert 456 ptr insert 23 ptr print 調(diào)用list類(lèi)中的成員函數(shù) void fastcallTf12 2 4 3 btnEndClick TObject Sender Close 12 3抽象類(lèi)12 3 1純虛函數(shù)與抽象類(lèi)1 純虛函數(shù)的概念定義形式 virtualtypefunc name 參數(shù)表 0 注意事項(xiàng) 在基類(lèi)中定義為純虛函數(shù)的函數(shù) 在任何派生類(lèi)中都必須定義自己的版本 否則將引起語(yǔ)法錯(cuò)誤 2 抽象類(lèi)的概念如果類(lèi)中至少有一個(gè)純虛函數(shù) 那么就稱(chēng)該類(lèi)為抽象類(lèi) 使用抽象類(lèi)的幾點(diǎn)規(guī)定 1 抽象類(lèi)只能用作其它類(lèi)的基類(lèi) 不能建立抽象類(lèi)對(duì)象 2 抽象類(lèi)不能用作參數(shù)類(lèi)型 函數(shù)返回類(lèi)型或顯式轉(zhuǎn)換的類(lèi)型 3 可以聲明指向抽象類(lèi)的指針和引用 此指針可以指向它的派生類(lèi) 進(jìn)而實(shí)現(xiàn)多態(tài)性 舉例說(shuō)明如下 classfigure public virtualdraw 0 figurea 錯(cuò)誤 不能建立抽象類(lèi)對(duì)象figure ptr 正確 可以聲明指向抽象類(lèi)的指針figuref 錯(cuò)誤 抽象類(lèi)不能作為函數(shù)的返回類(lèi)型voidg figure 錯(cuò)誤 抽象類(lèi)不能作為函數(shù)的參數(shù)類(lèi)型figure 正確 可以聲明抽象類(lèi)的引用 12 3 2純虛函數(shù)多態(tài)性的體現(xiàn)例2 includeclasscontainer 定義一個(gè)抽象類(lèi)protected doubleradius public container doubleradius container radius radius virtualdoublesurface area 0 純虛函數(shù)virtualdoublevolume 0 純虛函數(shù) classcube publiccontainer 定義正方體類(lèi)public cube doubleradius container radius doublesurface area 虛函數(shù)在本類(lèi)中的定義版本doublevolume classsphere publiccontainer 定義球體類(lèi)public sphere doubleradius container radius doublesurface area 虛函數(shù)在本類(lèi)中的定義版本doublevolume classcylinder publiccontainer 定義圓柱體類(lèi)doubleheight public cylinder doubleradius doubleheight container radius cylinder height height doublesurface area 虛函數(shù)在本類(lèi)中的定義版本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.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來(lái)的問(wèn)題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開(kāi)word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 面向?qū)ο蟪绦蛟O(shè)計(jì) 面向 對(duì)象 程序設(shè)計(jì) 講義
鏈接地址:http://m.appdesigncorp.com/p-8313184.html