




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、第九章 虛函數(shù)和多態(tài)性本章要點(diǎn)多態(tài)性的概念。多態(tài)性是指一種界面,多種實(shí)現(xiàn)。多態(tài)性分為靜態(tài)多態(tài)性和動(dòng)態(tài)多態(tài)性。虛函數(shù)。函數(shù)重載是靜態(tài)多態(tài)性的具體示例,虛函數(shù)是動(dòng)態(tài)多態(tài)性的具體示例。純虛函數(shù)和抽象類(lèi)。純虛函數(shù)是在基類(lèi)中說(shuō)明的虛函數(shù),在基類(lèi)中沒(méi)有定義,要求任何派生類(lèi)都必須定義自己的版本。如果一個(gè)類(lèi)至少有一個(gè)純虛函數(shù),則該類(lèi)稱為抽象類(lèi)。9.1 問(wèn)題引入在完成了第八章中的所有類(lèi)型設(shè)計(jì)和編碼后,可以編寫(xiě)這樣的測(cè)試代碼:期望得到如下輸出:Parallelogram: area = 35Rectangle: area = 72Diamond: area = 15Square: area = 49int mai
2、n()Parallelogram para(Parallelogram, 5, 7);Rectangle rect(Rectangle, 6, 12);Diamond diam(Diamond, 3, 5);Square sqr(Square, 7); List list; list += ¶list += ▭list += ⋄list += &sqr; list.traverse(access); return 0;void List:traverse(ACCESSFUN f) Node *p = head; while (p != NULL) f(p-quad
3、); p = p-next; void access(QUADPTR quad)cout what() : area = area () area()這樣的成員函數(shù)調(diào)用能取代基類(lèi)的同名函數(shù),那么就一定要使派生類(lèi)的area()覆蓋(override)基類(lèi)的同名函數(shù)9.3.1 虛函數(shù)的概念和特性1. 虛函數(shù)的概念要使派生類(lèi)的成員函數(shù)覆蓋基類(lèi)的同名成員,那么必須將基類(lèi)的成員函數(shù)說(shuō)明成是虛函數(shù),其語(yǔ)法如下:class 類(lèi)名public:virtual 成員函數(shù)名(參數(shù)列表);(ex9-1關(guān)鍵字virtual明確地告訴編譯器:該類(lèi)派生類(lèi)中的同名成員函數(shù)將覆蓋基類(lèi)已定義的函數(shù)多態(tài)類(lèi)多態(tài)類(lèi)(polymorp
4、hic class)一個(gè)聲明了虛函數(shù),或者其祖先類(lèi)中包含了虛函數(shù)的類(lèi)在繼承樹(shù)上,每一個(gè)設(shè)計(jì)良好(well-formed)的多態(tài)類(lèi)都有一個(gè)最終覆蓋函數(shù)(final overrider)如果沒(méi)有,那么該派生類(lèi)將從其祖先那里繼承過(guò)來(lái)。然而,這并不是一種好的設(shè)計(jì),而是病態(tài)的(ill-formed)對(duì)虛成員的訪問(wèn)在后代中,祖先的虛成員仍然是存在的、可訪問(wèn)的例:double Parallelogram:area() const Quadrangle:area();return width * height; 但這種訪問(wèn)只能在派生類(lèi)中進(jìn)行。虛特性一旦成員函數(shù)被說(shuō)明成虛的,那么我們稱該函數(shù)具有“虛特性”特點(diǎn):
5、虛特性必須賦予類(lèi)的成員函數(shù)。不能將虛函數(shù)說(shuō)明為全局(非成員的)函數(shù),也不能說(shuō)明為靜態(tài)成員函數(shù)。不能將友元說(shuō)明為虛函數(shù),但虛函數(shù)可以是另一個(gè)類(lèi)的友元。虛特性的繼承虛特性是可以被繼承的。在繼承樹(shù)上,一旦基類(lèi)中的某個(gè)函數(shù)被聲明成是虛的,那么其所有后代中原型相同的函數(shù)都將是虛的正如上例中的area(),后代中的該函數(shù)可以不必使用關(guān)鍵字virtual,因?yàn)樗詣?dòng)成為了虛函數(shù)。提問(wèn):如果派生類(lèi)中重載了一個(gè)原型不同的函數(shù),那么這個(gè)函數(shù)將會(huì)怎樣來(lái)影響虛特性的遺傳呢?(ex9-2)虛析構(gòu)函數(shù)類(lèi)的析構(gòu)函數(shù)可以被說(shuō)明成是虛函數(shù),并且也應(yīng)該是虛的。而類(lèi)的構(gòu)造函數(shù)不能為虛函數(shù)。提問(wèn):?jiǎn)柺裁搭?lèi)的析構(gòu)函數(shù)應(yīng)該是虛的?提示:
6、考慮用new創(chuàng)建的自由對(duì)象。例(ex9-3)解決問(wèn)題的方法有兩個(gè): 通過(guò)強(qiáng)制類(lèi)型轉(zhuǎn)換將指針p轉(zhuǎn)換為派生類(lèi)指針,具體做法如下:delete (Parallelogram *)(p); 將Quadrangle類(lèi)的析構(gòu)函數(shù)說(shuō)明成是虛的:virtual Quadrangle() 9.3.2 虛函數(shù)的實(shí)現(xiàn)機(jī)制例9-4 含有虛函數(shù)的類(lèi)的大小class QuadrangleWithNoVirtualprotected: int a;public: double area()return -1.0;virtual虛表編譯器首先要對(duì)每個(gè)包含虛函數(shù)的類(lèi)創(chuàng)建一個(gè)虛表(VTABLE)。在VTABLE中,編譯器放置該類(lèi)
7、的虛函數(shù)地址。在每個(gè)帶有虛函數(shù)的對(duì)象中,編譯器秘密地設(shè)置一個(gè)指針( 就 是 多 出 的 那 部 分 數(shù) 據(jù) ) , 稱 為 “ 虛 指 針(vpointer/VPTR)”,指向這個(gè)對(duì)象的VTABLE。Quadrangle對(duì)象VPTR&area()VTABLEParallelogram對(duì)象VPTR&area()VTABLEQuadrangle類(lèi)型的指針為每個(gè)類(lèi)設(shè)置VTABLE、初始化VPTR、為虛函數(shù)調(diào)用插入代碼,所有這些都是自動(dòng)完成的虛函數(shù)應(yīng)用場(chǎng)景那么,一個(gè)成員函數(shù)什么時(shí)候需要聲明為虛函數(shù)呢?主要考慮以下幾點(diǎn): 首先考慮成員函數(shù)所在的類(lèi)是否會(huì)做為基類(lèi)。然后看成員函數(shù)在類(lèi)的繼承后有無(wú)功能被修改?
8、如果希望修改其功能,一般將它聲明為虛函數(shù)。 如果成員函數(shù)在類(lèi)被繼承之后功能不需要修改,或派生類(lèi)中用不到該函數(shù),則不要把它聲明為虛函數(shù)。 應(yīng)當(dāng)考慮對(duì)成員函數(shù)的調(diào)用是通過(guò)對(duì)象名還是基類(lèi)指針或引用去訪問(wèn)。如果通過(guò)基類(lèi)指針或引用去訪問(wèn),則聲明為虛函數(shù)。 如果希望通過(guò)基類(lèi)指針或者引用訪問(wèn)派生類(lèi)成員函數(shù),但基類(lèi)功能比較抽象或者不能確定功能,可以將基類(lèi)定義為抽象類(lèi),即只定義函數(shù)名字,沒(méi)有函數(shù)體,具體功能由派生類(lèi)添加。9.4 純虛函數(shù)和抽象類(lèi)純虛(pure virtual)函數(shù)的引入基類(lèi)往往表示一些抽象的概念。例如,Quadrangle是一個(gè)基類(lèi),它表示一個(gè)沒(méi)有具象的四邊形,從Quadrangle可以派生出其
9、它具體的形體類(lèi)。在這棵繼承樹(shù)上,基類(lèi)Quadrangle體現(xiàn)了一個(gè)抽象的概念在這種情況下,基類(lèi)的有些虛函數(shù)沒(méi)有定義是很正常的,但是要求派生類(lèi)必須重定義這些虛函數(shù),以使派生類(lèi)有意義純虛函數(shù)純虛函數(shù)是一個(gè)在基類(lèi)中說(shuō)明的虛函數(shù),它在該基類(lèi)中沒(méi)有定義,要求任何派生類(lèi)都必須定義自己的版本。為說(shuō)明一個(gè)純虛函數(shù),使用下列一般形式:class Quadranglepublic:virtual double area() = 0;在類(lèi)的構(gòu)造和析構(gòu)函數(shù)中可以調(diào)用普通成員函數(shù)甚至普通虛成員,但如果直接或間接調(diào)用了純虛成員,那么該類(lèi)的行為是不可預(yù)知的。因此,應(yīng)該杜絕這類(lèi)行為。抽象類(lèi)如果一個(gè)類(lèi)至少有一個(gè)純虛函數(shù),那么就
10、稱該類(lèi)為“抽象類(lèi)(abstract class) ”假設(shè)類(lèi)A是一個(gè)抽象類(lèi),那么它的特點(diǎn)是:不能創(chuàng)建抽象類(lèi)A的對(duì)象。抽象類(lèi)A只能用作其它類(lèi)的基類(lèi)。例如:A obj; /errorclass B : public A ; /OK抽象類(lèi) 在抽象類(lèi)的派生類(lèi)中,如果純虛函數(shù)的最終覆蓋函數(shù)仍是一個(gè)純虛函數(shù)(即仍未提供一個(gè)函數(shù)體),那么該派生類(lèi)仍是一個(gè)抽象類(lèi)。抽象類(lèi) 抽象類(lèi)不能用作函數(shù)的參數(shù)類(lèi)型、返回類(lèi)型。例如:int f(A a); /errorA g() ; /error 可以聲明抽象類(lèi)的指針和引用,它們可以作為函數(shù)的參數(shù)或返回類(lèi)型。例如:A &r = obj, *p = &obj; /OKint h(A *, A&); /OKA* k(); /OKA& s(); /OK抽象類(lèi) 抽象類(lèi)不能作為顯式轉(zhuǎn)換的類(lèi)型。例如:class Cpublic:operator A() ;抽象類(lèi)提問(wèn)1:在類(lèi)中聲明了純虛函數(shù)后,可以為該函數(shù)定義函數(shù)體嗎?答案是肯定的。例如:class Quadranglepublic:virtual double area() = 0;double Quadrangle
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 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ì)用戶上傳內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- DZ/T 0126-1994固體礦產(chǎn)鉆孔地質(zhì)數(shù)據(jù)文件格式
- DZ/T 0101.12-1994地質(zhì)儀器儀表制造時(shí)間定額印制板
- DZ/T 0056-1993水文水井鉆探三牙輪鉆頭
- DZ/T 0053-1993液動(dòng)沖擊回轉(zhuǎn)鉆探技術(shù)規(guī)程
- CJ/T 396-2012鴨嘴式橡膠止回閥
- CJ/T 176-2007旋轉(zhuǎn)式潷水器
- CJ/T 159-2015鋁塑復(fù)合壓力管(對(duì)接焊)
- 2025年網(wǎng)絡(luò)規(guī)劃設(shè)計(jì)師考試職業(yè)提升試題及答案
- 初級(jí)社工文書(shū)寫(xiě)作考題及答案
- 2025年考生參與的試題及答案回顧
- 政府采購(gòu)法解析
- 信息必刷卷03(廣東專(zhuān)用)(解析版) -2025年高考物理考前信息必刷卷
- 《ISO 37001-2025 反賄賂管理體系要求及使用指南》專(zhuān)業(yè)解讀和應(yīng)用培訓(xùn)指導(dǎo)材料之3:5領(lǐng)導(dǎo)作用(雷澤佳編制-2025A0)
- 項(xiàng)目溝通管理培訓(xùn)
- 餐廳廚房考核管理制度
- 電影行業(yè)的融資渠道創(chuàng)新-全面剖析
- 2025-2030全球及中國(guó)前列腺癌藥物行業(yè)市場(chǎng)現(xiàn)狀供需分析及市場(chǎng)深度研究發(fā)展前景及規(guī)劃可行性分析研究報(bào)告
- 2025屆安徽省合肥45中學(xué)初三5月聯(lián)考英語(yǔ)試題試卷試卷含答案
- 隧道二襯臺(tái)車(chē)安裝拆除施工方案
- 2022旅游景區(qū)醫(yī)療救助應(yīng)急處置要求
- 門(mén)診預(yù)約號(hào)管理
評(píng)論
0/150
提交評(píng)論