面向?qū)ο蟪绦蛟O(shè)計(jì)ppt課件_第1頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)ppt課件_第2頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)ppt課件_第3頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)ppt課件_第4頁(yè)
面向?qū)ο蟪绦蛟O(shè)計(jì)ppt課件_第5頁(yè)
已閱讀5頁(yè),還剩57頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第第5 5章章 多態(tài)與籠統(tǒng)類多態(tài)與籠統(tǒng)類n 5.1 5.1 類層次的多態(tài)問(wèn)題類層次的多態(tài)問(wèn)題n 5.2 5.2 類型兼容規(guī)那么類型兼容規(guī)那么( (重點(diǎn)重點(diǎn)) )n 5.3 5.3 多態(tài)的概念多態(tài)的概念n 5.4 5.4 多態(tài)的分類多態(tài)的分類n 5.5 5.5 聯(lián)編聯(lián)編n 5.6 5.6 虛函數(shù)虛函數(shù)( (重點(diǎn)重點(diǎn)) )n 5.7 5.7 籠統(tǒng)類與純虛函數(shù)籠統(tǒng)類與純虛函數(shù)( (重點(diǎn)重點(diǎn)) )n【例【例5-15-1】在例】在例4-14-1程序中存在的兩個(gè)程序中存在的兩個(gè)缺乏:缺乏:n1 1基類基類Pay()Pay()和和Display()Display()的函數(shù)體的函數(shù)體均為空,在實(shí)現(xiàn)部分仍要寫(xiě)出

2、函數(shù)體均為空,在實(shí)現(xiàn)部分仍要寫(xiě)出函數(shù)體,顯得冗余。,顯得冗余。n2 2在主函數(shù)中,建立了在主函數(shù)中,建立了4 4個(gè)不同類個(gè)不同類的對(duì)象,進(jìn)展了類似的操作,反復(fù)寫(xiě)的對(duì)象,進(jìn)展了類似的操作,反復(fù)寫(xiě)了了4 4遍類似的語(yǔ)句,程序不夠簡(jiǎn)約。遍類似的語(yǔ)句,程序不夠簡(jiǎn)約。n基類設(shè)置成員函數(shù)基類設(shè)置成員函數(shù)Pay()Pay()和和Display()Display()的目的是為了一致規(guī)定類簇的根本行的目的是為了一致規(guī)定類簇的根本行為,雖有冗余,但也必要。為此,為,雖有冗余,但也必要。為此,C+C+提供了純虛函數(shù)來(lái)處理此問(wèn)題。提供了純虛函數(shù)來(lái)處理此問(wèn)題。 n在主函數(shù)中建立了在主函數(shù)中建立了4 4個(gè)不同類的對(duì)象,進(jìn)

3、展個(gè)不同類的對(duì)象,進(jìn)展了類似的操作,反復(fù)寫(xiě)了了類似的操作,反復(fù)寫(xiě)了4 4遍類似的語(yǔ)句。遍類似的語(yǔ)句。n應(yīng)該怎樣有效地來(lái)處置它們同樣的行為呢應(yīng)該怎樣有效地來(lái)處置它們同樣的行為呢?我們首先想到的是用循環(huán)處理,但調(diào)用?我們首先想到的是用循環(huán)處理,但調(diào)用這些同名函數(shù)的對(duì)象卻不一樣。這些同名函數(shù)的對(duì)象卻不一樣。n分析這些對(duì)象有一個(gè)共同點(diǎn),那就是來(lái)自分析這些對(duì)象有一個(gè)共同點(diǎn),那就是來(lái)自于同一個(gè)基類,而基類與派生類對(duì)象有什于同一個(gè)基類,而基類與派生類對(duì)象有什么關(guān)系呢?現(xiàn)實(shí)上,它們遵照類型兼容規(guī)么關(guān)系呢?現(xiàn)實(shí)上,它們遵照類型兼容規(guī)那么。那么。Employee Employee * *emp4=&m1,&t1,

4、&s1,&sm1; /emp4=&m1,&t1,&s1,&sm1; /聲明聲明籠統(tǒng)類指針數(shù)組籠統(tǒng)類指針數(shù)組for(int i=0;i4;i+)for(int i=0;iPay(); /empi-Pay(); /單一指令,實(shí)現(xiàn)多態(tài),單一指令,實(shí)現(xiàn)多態(tài),計(jì)算指針指向?qū)ο蟮墓べY計(jì)算指針指向?qū)ο蟮墓べYempi-Display();/empi-Display();/單一指令,實(shí)現(xiàn)多態(tài),單一指令,實(shí)現(xiàn)多態(tài),輸出指針指向?qū)ο蟮男畔⑤敵鲋羔樦赶驅(qū)ο蟮男畔?n類型兼容規(guī)那么是指在需求基類對(duì)象類型兼容規(guī)那么是指在需求基類對(duì)象的任何地方,都可以運(yùn)用公有派生類的任何地方,都可以運(yùn)用公有派生類的對(duì)象來(lái)替代。的對(duì)象來(lái)替代

5、。n經(jīng)過(guò)公有承繼,派生類得到了基類中經(jīng)過(guò)公有承繼,派生類得到了基類中除構(gòu)造函數(shù)、析構(gòu)函數(shù)之外的一切成除構(gòu)造函數(shù)、析構(gòu)函數(shù)之外的一切成員。這樣,公有派生類實(shí)踐就具備了員。這樣,公有派生類實(shí)踐就具備了基類的一切功能,凡是基類能處理的基類的一切功能,凡是基類能處理的問(wèn)題,公有派生類都可以處理。問(wèn)題,公有派生類都可以處理。 n類型兼容規(guī)那么中所指替代包括以下類型兼容規(guī)那么中所指替代包括以下情況:情況:n1 1派生類的對(duì)象可以賦值給基類的派生類的對(duì)象可以賦值給基類的對(duì)象。對(duì)象。n2 2派生類的對(duì)象可以初始化基類的派生類的對(duì)象可以初始化基類的援用。援用。n3 3派生類的對(duì)象的地址可以賦值給派生類的對(duì)象的地

6、址可以賦值給基類的指針變量?;惖闹羔樧兞?。n在替代之后,派生類對(duì)象就可以作為在替代之后,派生類對(duì)象就可以作為基類的對(duì)象運(yùn)用,但只能訪問(wèn)從基類基類的對(duì)象運(yùn)用,但只能訪問(wèn)從基類承繼的成員。承繼的成員。n【例【例5-35-3】例如類型兼容規(guī)那么的運(yùn)用】例如類型兼容規(guī)那么的運(yùn)用。n教材教材P261P261,該程序的運(yùn)轉(zhuǎn)結(jié)果為:,該程序的運(yùn)轉(zhuǎn)結(jié)果為:nBase classBase classnBase classBase classnBase classBase classnDerivel classDerivel classnDerive2 class Derive2 class n根據(jù)類型兼容規(guī)那

7、么,基類指針根據(jù)類型兼容規(guī)那么,基類指針p p可以可以指向派生類對(duì)象指向派生類對(duì)象obj2obj2、obj3obj3即派生即派生類對(duì)象可以替代基類對(duì)象,給基類指類對(duì)象可以替代基類對(duì)象,給基類指針賦值,但編譯時(shí),編譯器根據(jù)針賦值,但編譯時(shí),編譯器根據(jù)p p的的類型是基類型,自動(dòng)調(diào)用基類的類型是基類型,自動(dòng)調(diào)用基類的who()who(),所以結(jié)果如上所示。,所以結(jié)果如上所示。 n【思索題【思索題5-35-3】假設(shè)基類指針要訪問(wèn)派】假設(shè)基類指針要訪問(wèn)派生類的生類的who()who(),怎樣辦?,怎樣辦?n nC+C+提供了多態(tài)機(jī)制來(lái)處理這個(gè)問(wèn)題。提供了多態(tài)機(jī)制來(lái)處理這個(gè)問(wèn)題。n類型兼容規(guī)那么是類型兼

8、容規(guī)那么是C+C+多態(tài)的重要根底多態(tài)的重要根底。 n多態(tài)多態(tài)PolymorphismPolymorphism是指具有類似是指具有類似功能的不同函數(shù)運(yùn)用同一個(gè)稱號(hào)來(lái)實(shí)功能的不同函數(shù)運(yùn)用同一個(gè)稱號(hào)來(lái)實(shí)現(xiàn),從而可以運(yùn)用一樣的調(diào)用方式來(lái)現(xiàn),從而可以運(yùn)用一樣的調(diào)用方式來(lái)調(diào)用這些具有不同功能的同名函數(shù)的調(diào)用這些具有不同功能的同名函數(shù)的特性。特性。 nC+C+支持的多態(tài)可以分為四種類型:支持的多態(tài)可以分為四種類型:n重載多態(tài):函數(shù)重載和運(yùn)算符重載重載多態(tài):函數(shù)重載和運(yùn)算符重載n強(qiáng)迫多態(tài):強(qiáng)迫類型轉(zhuǎn)換強(qiáng)迫多態(tài):強(qiáng)迫類型轉(zhuǎn)換n包含多態(tài):虛函數(shù)包含多態(tài):虛函數(shù)n參數(shù)多態(tài):函數(shù)模板和類模板參數(shù)多態(tài):函數(shù)模板和類模板

9、 n聯(lián)編是指把一個(gè)標(biāo)識(shí)符名和一個(gè)存儲(chǔ)聯(lián)編是指把一個(gè)標(biāo)識(shí)符名和一個(gè)存儲(chǔ)地址聯(lián)絡(luò)在一同的過(guò)程。即函數(shù)調(diào)用地址聯(lián)絡(luò)在一同的過(guò)程。即函數(shù)調(diào)用與某個(gè)函數(shù)在多態(tài)的實(shí)現(xiàn)過(guò)程中,確與某個(gè)函數(shù)在多態(tài)的實(shí)現(xiàn)過(guò)程中,確定調(diào)用哪個(gè)同名聯(lián)絡(luò)的過(guò)程,又稱綁定調(diào)用哪個(gè)同名聯(lián)絡(luò)的過(guò)程,又稱綁定。分為:定。分為:n靜態(tài)聯(lián)編?kù)o態(tài)聯(lián)編n動(dòng)態(tài)聯(lián)編動(dòng)態(tài)聯(lián)編n靜態(tài)聯(lián)編是在編譯階段完成的聯(lián)編。靜態(tài)聯(lián)編是在編譯階段完成的聯(lián)編。例例5-25-2、例、例5-35-3及以前的函數(shù)重載都是及以前的函數(shù)重載都是采用靜態(tài)聯(lián)編方式。采用靜態(tài)聯(lián)編方式。n例例5-45-4,教材,教材P265P265,是靜態(tài)聯(lián)編。,是靜態(tài)聯(lián)編。n動(dòng)態(tài)聯(lián)編是在運(yùn)轉(zhuǎn)階段完成的聯(lián)編

10、。動(dòng)態(tài)聯(lián)編是在運(yùn)轉(zhuǎn)階段完成的聯(lián)編。 n在例在例5-45-4中,靜態(tài)聯(lián)編把基類指針中,靜態(tài)聯(lián)編把基類指針psps指指向的對(duì)象綁定到基類上,而在運(yùn)轉(zhuǎn)時(shí)向的對(duì)象綁定到基類上,而在運(yùn)轉(zhuǎn)時(shí)進(jìn)展動(dòng)態(tài)聯(lián)編將把進(jìn)展動(dòng)態(tài)聯(lián)編將把psps指向的對(duì)象綁定指向的對(duì)象綁定到派生類上。到派生類上。n可見(jiàn),同一個(gè)指針,在不同階段被綁可見(jiàn),同一個(gè)指針,在不同階段被綁定的類對(duì)象將是不同的,進(jìn)而被關(guān)聯(lián)定的類對(duì)象將是不同的,進(jìn)而被關(guān)聯(lián)的類成員函數(shù)也是不同的。的類成員函數(shù)也是不同的。n如何來(lái)確定是用靜態(tài)聯(lián)編還是用動(dòng)態(tài)如何來(lái)確定是用靜態(tài)聯(lián)編還是用動(dòng)態(tài)聯(lián)編呢?聯(lián)編呢?nC+C+規(guī)定,動(dòng)態(tài)聯(lián)編經(jīng)過(guò)承繼和虛函數(shù)規(guī)定,動(dòng)態(tài)聯(lián)編經(jīng)過(guò)承繼和虛函數(shù)

11、來(lái)實(shí)現(xiàn)。來(lái)實(shí)現(xiàn)。n虛函數(shù)是動(dòng)態(tài)聯(lián)編的根底。下面引見(jiàn)虛函數(shù)是動(dòng)態(tài)聯(lián)編的根底。下面引見(jiàn)虛函數(shù)。虛函數(shù)。n虛函數(shù)就是在基類中被關(guān)鍵字虛函數(shù)就是在基類中被關(guān)鍵字virtualvirtual闡明、并在一個(gè)或多個(gè)派生類中被重闡明、并在一個(gè)或多個(gè)派生類中被重新定義的成員函數(shù)。新定義的成員函數(shù)。n聲明虛函數(shù)的格式如下:聲明虛函數(shù)的格式如下:nvirtual virtual (););n在派生類中重新定義虛函數(shù)時(shí),其函在派生類中重新定義虛函數(shù)時(shí),其函數(shù)原型包括前往類型、函數(shù)名、參數(shù)數(shù)原型包括前往類型、函數(shù)名、參數(shù)個(gè)數(shù)與參數(shù)類型的順序,都必需與基個(gè)數(shù)與參數(shù)類型的順序,都必需與基類中的原型必需一樣。類中的原型必需一

12、樣。n一個(gè)函數(shù)一旦被聲明為虛函數(shù),那么一個(gè)函數(shù)一旦被聲明為虛函數(shù),那么無(wú)論聲明它的類被承繼了多少層,在無(wú)論聲明它的類被承繼了多少層,在每一層派生類中該函數(shù)都堅(jiān)持虛函數(shù)每一層派生類中該函數(shù)都堅(jiān)持虛函數(shù)特性。因此,在派生類中重新定義該特性。因此,在派生類中重新定義該函數(shù)時(shí),可以省略關(guān)鍵字函數(shù)時(shí),可以省略關(guān)鍵字virtualvirtual。但。但是,為了提高程序的可讀性,往往不是,為了提高程序的可讀性,往往不省略。省略。n在程序運(yùn)轉(zhuǎn)時(shí),不同類的對(duì)象調(diào)用各在程序運(yùn)轉(zhuǎn)時(shí),不同類的對(duì)象調(diào)用各自的虛函數(shù),這就是運(yùn)轉(zhuǎn)時(shí)多態(tài)。自的虛函數(shù),這就是運(yùn)轉(zhuǎn)時(shí)多態(tài)。n【例【例5-55-5】將例】將例5-45-4基類的成員

13、函數(shù)基類的成員函數(shù)print()print()設(shè)為虛函數(shù),采用對(duì)象指針調(diào)設(shè)為虛函數(shù),采用對(duì)象指針調(diào)用虛函數(shù),進(jìn)而實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編。用虛函數(shù),進(jìn)而實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編。 n該程序的運(yùn)轉(zhuǎn)結(jié)果為該程序的運(yùn)轉(zhuǎn)結(jié)果為: :nA studentA studentnA graduate studentA graduate studentnA studentA studentnA studentA studentnA graduate studentA graduate studentn【思索題【思索題5-55-5】假設(shè)將例】假設(shè)將例5-55-5中中StudentStudent類改類改為:為:nclass Student

14、class Studentn npublic:public:n virtual void print(); virtual void print(); /虛函數(shù)虛函數(shù)的聲明的聲明n;nvirtual void Student:print() /virtual void Student:print() /虛函虛函數(shù)的實(shí)現(xiàn)數(shù)的實(shí)現(xiàn)n n coutA studentendl; coutA studentendl;n n留意:當(dāng)有虛函數(shù)聲明時(shí),留意:當(dāng)有虛函數(shù)聲明時(shí),virtualvirtual關(guān)關(guān)鍵字只用在虛函數(shù)的聲明中,不能用鍵字只用在虛函數(shù)的聲明中,不能用在虛函數(shù)定義中。在虛函數(shù)定義中。 n【思

15、索題【思索題5-45-4】將例】將例5-55-5中用對(duì)象調(diào)用中用對(duì)象調(diào)用虛函數(shù),其結(jié)果如何?虛函數(shù),其結(jié)果如何?n【留意】只需經(jīng)過(guò)對(duì)象指針或?qū)ο笤玖粢狻恐恍杞?jīng)過(guò)對(duì)象指針或?qū)ο笤脕?lái)調(diào)用虛函數(shù),才干實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編用來(lái)調(diào)用虛函數(shù),才干實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編。假設(shè)采用對(duì)象來(lái)調(diào)用虛函數(shù),那么。假設(shè)采用對(duì)象來(lái)調(diào)用虛函數(shù),那么采用的是靜態(tài)聯(lián)編方式。采用的是靜態(tài)聯(lián)編方式。n【例【例5-65-6】將例】將例5-45-4基類的成員函數(shù)基類的成員函數(shù)print()print()設(shè)為虛函數(shù),采用對(duì)象援用調(diào)設(shè)為虛函數(shù),采用對(duì)象援用調(diào)用虛函數(shù),進(jìn)而實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編。用虛函數(shù),進(jìn)而實(shí)現(xiàn)動(dòng)態(tài)聯(lián)編。 n運(yùn)轉(zhuǎn)結(jié)果闡明,只需定義一個(gè)基類的運(yùn)轉(zhuǎn)

16、結(jié)果闡明,只需定義一個(gè)基類的對(duì)象指針或?qū)ο笤?,就可以調(diào)用期對(duì)象指針或?qū)ο笤?,就可以調(diào)用期望的虛函數(shù)。望的虛函數(shù)。n思索題思索題: :假設(shè)將對(duì)象援用或?qū)ο笾羔槗Q假設(shè)將對(duì)象援用或?qū)ο笾羔槗Q為對(duì)象為對(duì)象, ,那么是靜態(tài)聯(lián)編。那么是靜態(tài)聯(lián)編。n在實(shí)踐運(yùn)用中,編程人員不用過(guò)多地在實(shí)踐運(yùn)用中,編程人員不用過(guò)多地思索類的層次關(guān)系,無(wú)須顯式地寫(xiě)出思索類的層次關(guān)系,無(wú)須顯式地寫(xiě)出虛函數(shù)的途徑,只須將對(duì)象指針指向虛函數(shù)的途徑,只須將對(duì)象指針指向相應(yīng)的派生類或援用相應(yīng)的對(duì)象,經(jīng)相應(yīng)的派生類或援用相應(yīng)的對(duì)象,經(jīng)過(guò)動(dòng)態(tài)聯(lián)編就可以對(duì)音訊做出正確的過(guò)動(dòng)態(tài)聯(lián)編就可以對(duì)音訊做出正確的反響。反響。1 1假設(shè)他期望在派生類中重

17、新定義一假設(shè)他期望在派生類中重新定義一個(gè)成員函數(shù),那么他就應(yīng)該在基類中個(gè)成員函數(shù),那么他就應(yīng)該在基類中把該函數(shù)設(shè)為把該函數(shù)設(shè)為virtualvirtual。2 2以單一指令調(diào)用不同函數(shù),這種性以單一指令調(diào)用不同函數(shù),這種性質(zhì)就是質(zhì)就是 多態(tài)多態(tài) 。3 3虛函數(shù)是虛函數(shù)是C+C+言語(yǔ)的多態(tài)性質(zhì)和動(dòng)言語(yǔ)的多態(tài)性質(zhì)和動(dòng)態(tài)綁定的關(guān)鍵。態(tài)綁定的關(guān)鍵。4 4虛函數(shù)派生下去仍是虛函數(shù),而且虛函數(shù)派生下去仍是虛函數(shù),而且可以省略可以省略virtualvirtual關(guān)鍵詞。關(guān)鍵詞。n【思索題【思索題5-85-8】虛函數(shù)與虛擬承繼有什】虛函數(shù)與虛擬承繼有什么類似的地方?他們之間有沒(méi)有聯(lián)絡(luò)么類似的地方?他們之間有沒(méi)

18、有聯(lián)絡(luò)?n假設(shè)能了解假設(shè)能了解C+C+編譯器對(duì)于虛函數(shù)的實(shí)編譯器對(duì)于虛函數(shù)的實(shí)現(xiàn)方式,我們就能知道為什么虛函數(shù)現(xiàn)方式,我們就能知道為什么虛函數(shù)可以實(shí)現(xiàn)動(dòng)態(tài)綁定。下面引見(jiàn)虛函數(shù)可以實(shí)現(xiàn)動(dòng)態(tài)綁定。下面引見(jiàn)虛函數(shù)表。表。n為了到達(dá)動(dòng)態(tài)綁定的目的,為了到達(dá)動(dòng)態(tài)綁定的目的,C+C+編譯器編譯器經(jīng)過(guò)某個(gè)表格,在執(zhí)行期間經(jīng)過(guò)某個(gè)表格,在執(zhí)行期間“間接調(diào)間接調(diào)用實(shí)踐上欲綁定的函數(shù),這樣的表格用實(shí)踐上欲綁定的函數(shù),這樣的表格稱為虛函數(shù)表稱為虛函數(shù)表vtablevtable。n每一個(gè)含有虛函數(shù)的類,編譯器都為每一個(gè)含有虛函數(shù)的類,編譯器都為它做一個(gè)虛函數(shù)表,表中的每一項(xiàng)都它做一個(gè)虛函數(shù)表,表中的每一項(xiàng)都指向一個(gè)虛

19、函數(shù)的地址,實(shí)現(xiàn)上是一指向一個(gè)虛函數(shù)的地址,實(shí)現(xiàn)上是一個(gè)函數(shù)指針的數(shù)組。此外,編譯器也個(gè)函數(shù)指針的數(shù)組。此外,編譯器也會(huì)為類加上一個(gè)數(shù)據(jù)成員,是一個(gè)指會(huì)為類加上一個(gè)數(shù)據(jù)成員,是一個(gè)指向該虛函數(shù)表的指針向該虛函數(shù)表的指針vptrvptr。 Wind objectWind objectvptrvptrStringed objectStringed objectvptrvptrPercussion objectPercussion objectvptrvptr&Wind:play()&Wind:play()& Percussion:play()& Percussion:play()& Stringe

20、d:play()& Stringed:play()n當(dāng)經(jīng)過(guò)對(duì)象調(diào)用虛函數(shù)時(shí),是經(jīng)過(guò)當(dāng)經(jīng)過(guò)對(duì)象調(diào)用虛函數(shù)時(shí),是經(jīng)過(guò)vptrvptr找到虛函數(shù)表,再找出虛函數(shù)的找到虛函數(shù)表,再找出虛函數(shù)的真正地址。真正地址。n至于基類指針或援用指向派生類對(duì)象至于基類指針或援用指向派生類對(duì)象時(shí),調(diào)用的是派生類虛函數(shù),其微妙時(shí),調(diào)用的是派生類虛函數(shù),其微妙在于虛函數(shù)表以及一種間接調(diào)用方式在于虛函數(shù)表以及一種間接調(diào)用方式:n虛函數(shù)表中的內(nèi)容根據(jù)類中的虛函數(shù)虛函數(shù)表中的內(nèi)容根據(jù)類中的虛函數(shù)聲明次序,一一填入函數(shù)指針。聲明次序,一一填入函數(shù)指針。n派生類會(huì)承繼基類的虛函數(shù)表以及派生類會(huì)承繼基類的虛函數(shù)表以及其它一切可以承繼

21、的成員,我們?cè)谄渌磺锌梢猿欣^的成員,我們?cè)谂缮愔懈膶?xiě)虛函數(shù)時(shí),虛函數(shù)表也派生類中改寫(xiě)虛函數(shù)時(shí),虛函數(shù)表也遭到了影響,表中每一項(xiàng)所指向函數(shù)遭到了影響,表中每一項(xiàng)所指向函數(shù)地址將不再是基類中的函數(shù)地址,而地址將不再是基類中的函數(shù)地址,而是派生類的函數(shù)地址。是派生類的函數(shù)地址。n因此,一個(gè)指向因此,一個(gè)指向StudentStudent對(duì)象的指針,對(duì)象的指針,所調(diào)用的所調(diào)用的printprint函數(shù)就是函數(shù)就是Student:print(), Student:print(), 而一個(gè)指向而一個(gè)指向GStudentGStudent對(duì)象的指針,所調(diào)用的對(duì)象的指針,所調(diào)用的printprint函數(shù)就是函

22、數(shù)就是GStudent:print()GStudent:print()。 n將一個(gè)類的成員函數(shù)定義為虛函數(shù)有將一個(gè)類的成員函數(shù)定義為虛函數(shù)有利于編程,雖然它會(huì)引起一些額外的利于編程,雖然它會(huì)引起一些額外的開(kāi)銷。開(kāi)銷。n那么,能否一切成員函數(shù)都可以聲明那么,能否一切成員函數(shù)都可以聲明為虛函數(shù)呢?為虛函數(shù)呢?n普通來(lái)說(shuō),可將類簇中具有共性的成普通來(lái)說(shuō),可將類簇中具有共性的成員函數(shù)聲明為虛函數(shù),而具有個(gè)性的員函數(shù)聲明為虛函數(shù),而具有個(gè)性的函數(shù)沒(méi)有必要聲明為虛函數(shù)。但是下函數(shù)沒(méi)有必要聲明為虛函數(shù)。但是下面的情況例外:面的情況例外:n(1)(1)靜態(tài)成員函數(shù)不能聲明為虛函數(shù)。由于靜態(tài)成員函數(shù)不能聲明為虛

23、函數(shù)。由于靜態(tài)成員函數(shù)不屬于某一個(gè)對(duì)象,沒(méi)有多靜態(tài)成員函數(shù)不屬于某一個(gè)對(duì)象,沒(méi)有多態(tài)性的特征。態(tài)性的特征。n(2)(2)構(gòu)造函數(shù)不能是虛函數(shù)。構(gòu)造函數(shù)是在構(gòu)造函數(shù)不能是虛函數(shù)。構(gòu)造函數(shù)是在定義對(duì)象時(shí)被調(diào)用,完成對(duì)象的初始化,定義對(duì)象時(shí)被調(diào)用,完成對(duì)象的初始化,此時(shí)對(duì)象還沒(méi)有完全建立。虛函數(shù)作為運(yùn)此時(shí)對(duì)象還沒(méi)有完全建立。虛函數(shù)作為運(yùn)轉(zhuǎn)時(shí)的多態(tài)性的根底,主要是針對(duì)對(duì)象的轉(zhuǎn)時(shí)的多態(tài)性的根底,主要是針對(duì)對(duì)象的,而構(gòu)造函數(shù)是在對(duì)象產(chǎn)生之前運(yùn)轉(zhuǎn)的。,而構(gòu)造函數(shù)是在對(duì)象產(chǎn)生之前運(yùn)轉(zhuǎn)的。所以,將構(gòu)造函數(shù)聲明為虛函數(shù)是沒(méi)有意所以,將構(gòu)造函數(shù)聲明為虛函數(shù)是沒(méi)有意義的。義的。 n(3)(3)內(nèi)聯(lián)成員函數(shù)不能聲明為虛

24、函數(shù)。內(nèi)聯(lián)成員函數(shù)不能聲明為虛函數(shù)。由于內(nèi)聯(lián)函數(shù)的執(zhí)行代碼是明確的,由于內(nèi)聯(lián)函數(shù)的執(zhí)行代碼是明確的,在編譯時(shí)已被交換,沒(méi)有多態(tài)性的特在編譯時(shí)已被交換,沒(méi)有多態(tài)性的特征。假設(shè)將那些在類聲明時(shí)就定義內(nèi)征。假設(shè)將那些在類聲明時(shí)就定義內(nèi)容的成員函數(shù)聲明為虛函數(shù),此時(shí)函容的成員函數(shù)聲明為虛函數(shù),此時(shí)函數(shù)不是內(nèi)聯(lián)函數(shù),而以多態(tài)性出現(xiàn)。數(shù)不是內(nèi)聯(lián)函數(shù),而以多態(tài)性出現(xiàn)。n(4)(4)析構(gòu)函數(shù)可以是虛函數(shù),且往往被析構(gòu)函數(shù)可以是虛函數(shù),且往往被定義為虛函數(shù)。普通來(lái)說(shuō),假設(shè)某類定義為虛函數(shù)。普通來(lái)說(shuō),假設(shè)某類中有虛函數(shù),那么其析構(gòu)函數(shù)也該當(dāng)中有虛函數(shù),那么其析構(gòu)函數(shù)也該當(dāng)定義為虛函數(shù)。定義為虛函數(shù)。n特別是需求析

25、構(gòu)函數(shù)完成一些有意義特別是需求析構(gòu)函數(shù)完成一些有意義的操作,如釋放內(nèi)存時(shí),由于實(shí)施多的操作,如釋放內(nèi)存時(shí),由于實(shí)施多態(tài)性時(shí)是經(jīng)過(guò)將基類的指針指向派生態(tài)性時(shí)是經(jīng)過(guò)將基類的指針指向派生類的對(duì)象來(lái)完成的,假設(shè)刪除該指針類的對(duì)象來(lái)完成的,假設(shè)刪除該指針,就會(huì)調(diào)用該指針指向的派生類的析,就會(huì)調(diào)用該指針指向的派生類的析構(gòu)函數(shù),而派生類的析構(gòu)函數(shù)又自動(dòng)構(gòu)函數(shù),而派生類的析構(gòu)函數(shù)又自動(dòng)調(diào)用基類的析構(gòu)函數(shù),這樣整個(gè)派生調(diào)用基類的析構(gòu)函數(shù),這樣整個(gè)派生類的對(duì)象才被完全釋放。類的對(duì)象才被完全釋放。n因此,析構(gòu)函數(shù)常被聲明為虛函數(shù)。因此,析構(gòu)函數(shù)常被聲明為虛函數(shù)。假設(shè)一個(gè)類的析構(gòu)函數(shù)是虛函數(shù),那假設(shè)一個(gè)類的析構(gòu)函數(shù)是

26、虛函數(shù),那么,由它派生的一切子類的析構(gòu)函數(shù)么,由它派生的一切子類的析構(gòu)函數(shù)也是虛函數(shù)。也是虛函數(shù)。n下面引見(jiàn)虛析構(gòu)函數(shù)。下面引見(jiàn)虛析構(gòu)函數(shù)。n虛析構(gòu)函數(shù)的聲明格式如下:虛析構(gòu)函數(shù)的聲明格式如下:nvirtual virtual ();();n【例【例5-75-7】虛析構(gòu)函數(shù)例如。教材】虛析構(gòu)函數(shù)例如。教材P272P272n利用虛函數(shù)可以使所設(shè)計(jì)的軟件系統(tǒng)利用虛函數(shù)可以使所設(shè)計(jì)的軟件系統(tǒng)變得靈敏,提高了代碼的可重用性。變得靈敏,提高了代碼的可重用性。n虛函數(shù)為一個(gè)類簇中一切派生類的同虛函數(shù)為一個(gè)類簇中一切派生類的同一行為提供了一致的接口,使得程序一行為提供了一致的接口,使得程序員在運(yùn)用一個(gè)類簇時(shí)

27、只須記住一個(gè)接員在運(yùn)用一個(gè)類簇時(shí)只須記住一個(gè)接口即可??诩纯伞(1)(1)假設(shè)在派生類中沒(méi)有重新定義虛函假設(shè)在派生類中沒(méi)有重新定義虛函數(shù),那么派生類的對(duì)象將運(yùn)用基類的數(shù),那么派生類的對(duì)象將運(yùn)用基類的虛函數(shù)代碼。虛函數(shù)代碼。n(2)(2)在派生類中重新定義虛函數(shù)時(shí),必在派生類中重新定義虛函數(shù)時(shí),必需保證函數(shù)值類型和參數(shù)與基類中的需保證函數(shù)值類型和參數(shù)與基類中的聲明完全一致。否那么,派生類的函聲明完全一致。否那么,派生類的函數(shù)也不具備多態(tài)性。數(shù)也不具備多態(tài)性。n根據(jù)上述引見(jiàn),我們可以將例根據(jù)上述引見(jiàn),我們可以將例5-15-1的的Pay()Pay()和和Display()Display()定義為虛

28、函數(shù),從定義為虛函數(shù),從而處理例而處理例4-14-1遺留下來(lái)的第二個(gè)問(wèn)題。遺留下來(lái)的第二個(gè)問(wèn)題。n另外,公司的人員有另外,公司的人員有4 4類,它們的基類類,它們的基類EmployeeEmployee實(shí)踐上是不需求實(shí)例化對(duì)象實(shí)踐上是不需求實(shí)例化對(duì)象的,的,EmployeeEmployee也無(wú)法為虛函數(shù)定義詳也無(wú)法為虛函數(shù)定義詳細(xì)的實(shí)現(xiàn),這時(shí)可以將細(xì)的實(shí)現(xiàn),這時(shí)可以將EmployeeEmployee聲明聲明為純虛函數(shù)。包含純虛函數(shù)的類稱為為純虛函數(shù)。包含純虛函數(shù)的類稱為籠統(tǒng)類。籠統(tǒng)類。n籠統(tǒng)類專門作為基類派生新類?;\統(tǒng)籠統(tǒng)類專門作為基類派生新類?;\統(tǒng)類的主要作用是將有關(guān)的派生類組織類的主要作用是

29、將有關(guān)的派生類組織在一個(gè)承繼層次構(gòu)造中,由籠統(tǒng)類為在一個(gè)承繼層次構(gòu)造中,由籠統(tǒng)類為它們提供一個(gè)公共的根,相關(guān)的派生它們提供一個(gè)公共的根,相關(guān)的派生類就從這個(gè)根派生出來(lái)。類就從這個(gè)根派生出來(lái)。 n含有純虛函數(shù)的類就是籠統(tǒng)類。含有純虛函數(shù)的類就是籠統(tǒng)類。 n在例在例4-14-1中遺留的另一個(gè)問(wèn)題是中遺留的另一個(gè)問(wèn)題是: : employeeemployee類的成員函數(shù)類的成員函數(shù)pay()pay()和和display()display()的函數(shù)體為空的函數(shù)體為空, ,在實(shí)現(xiàn)部分在實(shí)現(xiàn)部分仍要寫(xiě)出函數(shù)體仍要寫(xiě)出函數(shù)體, ,顯得冗余。顯得冗余。n現(xiàn)實(shí)上,現(xiàn)實(shí)上,employeeemployee類的成員

30、函數(shù)根本類的成員函數(shù)根本不會(huì)被調(diào)用,所以不用定義它。于是不會(huì)被調(diào)用,所以不用定義它。于是+提供了純虛函數(shù)來(lái)處理這個(gè)問(wèn)題提供了純虛函數(shù)來(lái)處理這個(gè)問(wèn)題。 n純虛函數(shù)是為理處理在基類中無(wú)法實(shí)純虛函數(shù)是為理處理在基類中無(wú)法實(shí)現(xiàn)的函數(shù)現(xiàn)的函數(shù), ,而在派生類中再給出函數(shù)的而在派生類中再給出函數(shù)的詳細(xì)實(shí)現(xiàn),它只需求在基類中闡明函詳細(xì)實(shí)現(xiàn),它只需求在基類中闡明函數(shù)原型用來(lái)規(guī)定整個(gè)類簇的一致接口數(shù)原型用來(lái)規(guī)定整個(gè)類簇的一致接口方式。方式。n純虛函數(shù)的聲明格式為:純虛函數(shù)的聲明格式為:nvirtual virtual ()=0;)=0;n純虛函數(shù)與函數(shù)體為空的虛函數(shù)是有純虛函數(shù)與函數(shù)體為空的虛函數(shù)是有區(qū)別的:區(qū)

31、別的:n前者有函數(shù)體前者有函數(shù)體, ,而后者沒(méi)有函數(shù)體;而后者沒(méi)有函數(shù)體;n前者所在的類是籠統(tǒng)類前者所在的類是籠統(tǒng)類, ,不能直接進(jìn)展不能直接進(jìn)展實(shí)例化實(shí)例化, ,而后者所在的類是可以實(shí)例化而后者所在的類是可以實(shí)例化的。的。 n【例【例5-95-9】例如純虛函數(shù)及籠統(tǒng)類。計(jì)】例如純虛函數(shù)及籠統(tǒng)類。計(jì)算圖形面積。例如,要定義一個(gè)算圖形面積。例如,要定義一個(gè)SquareSquare類和類和CircleCircle類,它們有共同的類,它們有共同的屬性屬性x x、y y,以及共同的操作,以及共同的操作setvalue()setvalue()和和area()area(),由于,由于area()area()在在兩個(gè)類的計(jì)算方法不同,但又屬于一兩個(gè)類的計(jì)算方法不同,但又屬于一個(gè)類簇,為此,定義一個(gè)籠統(tǒng)類個(gè)類簇,為此,定義一個(gè)籠統(tǒng)類ShapeShape,一致它們的屬性和操作。籠統(tǒng)類和,一致它們的屬性和操作?;\統(tǒng)類和純虛函數(shù)的純虛函數(shù)的UMLUML圖表示如圖圖表示如圖5-35-3所示。所示。ShapeShape# x:int# x:int# y:int# y:int+ setvalue():void+ setvalue():void+area():void+area()

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論