第五章 多態(tài)性_第1頁
第五章 多態(tài)性_第2頁
第五章 多態(tài)性_第3頁
第五章 多態(tài)性_第4頁
第五章 多態(tài)性_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、第五章、多態(tài)性本章介紹多態(tài)性的基本概念、運(yùn)算符重載實(shí)現(xiàn)方法、本章介紹多態(tài)性的基本概念、運(yùn)算符重載實(shí)現(xiàn)方法、虛函數(shù)等內(nèi)容。虛函數(shù)等內(nèi)容。面向?qū)ο蟮某绦蛟O(shè)計(jì)3/21第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4 本章主要內(nèi)容: 多態(tài)性概述 運(yùn)算符重載 類型轉(zhuǎn)換 虛函數(shù)面向?qū)ο蟮某绦蛟O(shè)計(jì)4/21多態(tài)性概念 多態(tài)性就是不同對(duì)象收到相同的消息時(shí),產(chǎn)生不同的動(dòng)作。 直觀地說,多態(tài)性是指用一個(gè)名字定義不同的函數(shù),這些函數(shù)執(zhí)行不同但又類似的操作,從而可以使用相同的調(diào)用方式來調(diào)用這些具有不同功能的同名函數(shù)。 第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類

2、型轉(zhuǎn)換5.3 虛函數(shù)5.4面向?qū)ο蟮某绦蛟O(shè)計(jì)5/21 多態(tài)的實(shí)現(xiàn) 多態(tài)從實(shí)現(xiàn)的角度來講可以劃分為兩類:編譯時(shí)的多態(tài)和運(yùn)行時(shí)的多態(tài)。 編譯時(shí)的多態(tài)是通過靜態(tài)聯(lián)編來實(shí)現(xiàn)的。靜態(tài)聯(lián)編就是在編譯階段完成的聯(lián)編。編譯時(shí)多態(tài)性主要是通過函數(shù)重載和運(yùn)算符重載實(shí)現(xiàn)的。 運(yùn)行時(shí)的多態(tài)是用動(dòng)態(tài)聯(lián)編實(shí)現(xiàn)的。動(dòng)態(tài)聯(lián)編是運(yùn)行階段完成的聯(lián)編。運(yùn)行時(shí)多態(tài)性主要是通過虛函數(shù)來實(shí)現(xiàn)的。 第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4面向?qū)ο蟮某绦蛟O(shè)計(jì)6/21編譯期多態(tài)運(yùn)算符重載 簡(jiǎn)單地說,多態(tài)就是給不同類型的對(duì)象發(fā)送相同的消息時(shí),對(duì)象會(huì)做出不同的響應(yīng)。 一般情況下,我們所說的面向?qū)ο蟪?/p>

3、序設(shè)計(jì)中的多態(tài),所指的都是由虛函數(shù)實(shí)現(xiàn)的運(yùn)行時(shí)多態(tài)。 從概念上看,C+的運(yùn)算符重載技術(shù)也可以看成是一種實(shí)現(xiàn)多態(tài)的手段。第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4面向?qū)ο蟮某绦蛟O(shè)計(jì)7/21什么是運(yùn)算符重載 C+中現(xiàn)有的絕大多數(shù)運(yùn)算符只能以基本數(shù)據(jù)類型的量作為其操作的對(duì)象。運(yùn)算符重載就是要給現(xiàn)有的運(yùn)算符賦予新的功能,使其可以操作類的對(duì)象。 運(yùn)算符重載的本質(zhì)是函數(shù)重載。如果為某個(gè)類設(shè)計(jì)了運(yùn)算符op的重載函數(shù),則當(dāng)使用op操作該類的對(duì)象時(shí),編譯器將調(diào)用運(yùn)算符重載函數(shù)完成操作任務(wù)。 由于運(yùn)算符重載函數(shù)的調(diào)用方式是靜態(tài)綁定,所以可以將運(yùn)算符重載稱之為編譯期多態(tài)

4、。第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4面向?qū)ο蟮某绦蛟O(shè)計(jì)8/21C+對(duì)運(yùn)算符重載的限定1)只能重載現(xiàn)有的運(yùn)算符,而不能創(chuàng)造新的運(yùn)算符; 2) 現(xiàn)有運(yùn)算符中,以下幾個(gè)不能被重載,它們是:用于訪問對(duì)象成員的“.”操作符、成員指針運(yùn)算符“*”、域解析操作符“:”、條件運(yùn)算符“?:”、sizeof運(yùn)算符、typeid運(yùn)算符、和四個(gè)類型轉(zhuǎn)換操作符:const_cast、static_cast、dynamic_cast、reinterpret_cast ; 3) 運(yùn)算符重載不能改變?cè)\(yùn)算符的優(yōu)先級(jí)和結(jié)合性; 第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)

5、算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4面向?qū)ο蟮某绦蛟O(shè)計(jì)9/21 C+對(duì)運(yùn)算符重載的限定(續(xù)) 4)運(yùn)算符重載不能改變?cè)\(yùn)算符的操作數(shù)個(gè)數(shù);即一元運(yùn)算符被重載后,還是一元運(yùn)算符,二元運(yùn)算符被重載后,還是二元運(yùn)算符; 5)重載后的運(yùn)算符必須至少有一個(gè)操作數(shù)是類的對(duì)象。這條限定防止編程者為基本數(shù)據(jù)類型重載運(yùn)算符。否則,編程者有可能重載加法運(yùn)算符“+”,來完成基本數(shù)據(jù)類型的減法運(yùn)算; 第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4面向?qū)ο蟮某绦蛟O(shè)計(jì)10/21 C+對(duì)運(yùn)算符重載的限定(續(xù)) 6) 運(yùn)算符重載函數(shù)可以是類的成員函數(shù),也可以是類的友元函數(shù)。但是

6、以下的運(yùn)算符只能通過成員函數(shù)進(jìn)行重載。它們是:賦值運(yùn)算符“=”、函數(shù)調(diào)用操作符“()”、數(shù)組下標(biāo)操作符“”、使用指針訪問對(duì)象成員的操作符“-” 。 關(guān)鍵字operator用來聲明和定義運(yùn)算符重載函數(shù)。運(yùn)算符重載函數(shù)可以是類的非靜態(tài)成員函數(shù),也可以是類的友元函數(shù)。第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4面向?qū)ο蟮某绦蛟O(shè)計(jì)11/21類的成員函數(shù)實(shí)現(xiàn)運(yùn)算符重載 當(dāng)運(yùn)算符重載函數(shù)被定義為類的成員函數(shù)時(shí),聲明和定義的語法格式如下: 在類中聲明運(yùn)算符重載函數(shù)(類的成員函數(shù)) : 返回值類型 operator 運(yùn)算符 (形參列表); 定義運(yùn)算符重載函數(shù)(類的成

7、員函數(shù)) : 返回值類型 類名:operator 運(yùn)算符 (形參列表) 函數(shù)體; 第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4面向?qū)ο蟮某绦蛟O(shè)計(jì)12/21類的成員函數(shù)實(shí)現(xiàn)運(yùn)算符重載 形參列表中是運(yùn)算符的操作對(duì)象,需要注意,因?yàn)楸欢x為是類的成員函數(shù),所以參數(shù)的個(gè)數(shù)應(yīng)該比運(yùn)算符實(shí)際的操作數(shù)個(gè)數(shù)少一個(gè),因?yàn)檎{(diào)用函數(shù)的對(duì)象本身就是運(yùn)算符的一個(gè)操作數(shù)。例如,如果為A類重載了加法運(yùn)算符“+”,用來完成兩個(gè)A類對(duì)象的相加操作,且運(yùn)算符重載函數(shù)為類的成員函數(shù),則函數(shù)的聲明語句為: A operator+ (A a); 第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)

8、算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4面向?qū)ο蟮某绦蛟O(shè)計(jì)13/21重載一元運(yùn)算符 一元運(yùn)算符有前置(運(yùn)算符在操作數(shù)之前,如-a,&a)和后置(運(yùn)算符在操作數(shù)之后,如a+,a-)之分。 C+語法規(guī)定,當(dāng)使用類的成員函數(shù)實(shí)現(xiàn)一元運(yùn)算符重載時(shí),前置一元運(yùn)算符的重載函數(shù)沒有形式參數(shù);而后置一元運(yùn)算符的重載函數(shù)有一個(gè)int型的形式參數(shù),這個(gè)int型參數(shù)的作用就是幫助編譯器區(qū)分前置和后置的一元運(yùn)算符重載函數(shù),所以在定義函數(shù)時(shí),無需寫出參數(shù)名。第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4面向?qū)ο蟮某绦蛟O(shè)計(jì)14/21雙目運(yùn)算符重載: 在類中聲明運(yùn)算符重載

9、函數(shù)(類的成員函數(shù)) : 返回值類型 operator 運(yùn)算符 (形參列表); 定義運(yùn)算符重載函數(shù)(類的成員函數(shù)) : 返回值類型 類名:operator 運(yùn)算符 (形參列表) 函數(shù)體; 第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4面向?qū)ο蟮某绦蛟O(shè)計(jì)15/21友元函數(shù)實(shí)現(xiàn)運(yùn)算符重載 將運(yùn)算符重載函數(shù)聲明和定義為類的友元函數(shù)的語法格式如下: 首先在類中使用關(guān)鍵字friend,將運(yùn)算符重載函數(shù)聲明為類的友元函數(shù): friend 返回值類型 operator運(yùn)算符(形參列表); 在類外定義友元函數(shù)時(shí),不能使用關(guān)鍵字friend: 返回值類型 operato

10、r運(yùn)算符(形參列表) 函數(shù)體; 第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4面向?qū)ο蟮某绦蛟O(shè)計(jì)16/21友元函數(shù)實(shí)現(xiàn)運(yùn)算符重載 友元函數(shù)不是類的成員函數(shù),所以函數(shù)內(nèi)部沒有隱含的this指針,函數(shù)的參數(shù)個(gè)數(shù)和運(yùn)算符的操作數(shù)個(gè)數(shù)相同。但對(duì)于一元運(yùn)算符重載函數(shù)而言,在后置運(yùn)算符重載函數(shù)中應(yīng)多聲明了一個(gè)int型參數(shù),該參數(shù)的唯一作用就是區(qū)分前置和后置重載函數(shù)。第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4面向?qū)ο蟮某绦蛟O(shè)計(jì)17/21成員函數(shù)與友元函數(shù)實(shí)現(xiàn)運(yùn)算符重載異同1) 成員函數(shù)較友元函數(shù)多一個(gè)參數(shù);2) 雙目運(yùn)算

11、符均可以采用兩種方式實(shí)現(xiàn),單目運(yùn)算符有時(shí)候只能采用友元來實(shí)現(xiàn);如: obj = 100 + obj;3) 調(diào)用方式可以采用習(xí)慣方式,也可采用專門方式調(diào)用;4) C+中的大部分運(yùn)算符,可以聲明為成員或友元函數(shù)。 第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4面向?qū)ο蟮某绦蛟O(shè)計(jì)18/21賦值運(yùn)算符”=”的重載采用默認(rèn)的賦值運(yùn)算符實(shí)現(xiàn)的數(shù)據(jù)成員賦值是一種淺拷貝,涉及到深層次應(yīng)用的使用會(huì)產(chǎn)生一定的問題。第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4面向?qū)ο蟮某绦蛟O(shè)計(jì)19/21這就是指針懸掛(Dangling Point

12、er)問題 導(dǎo)致懸掛指針的兩個(gè)經(jīng)典場(chǎng)景: 1、對(duì)已釋放的C+對(duì)象進(jìn)行重引用,即釋放重引用漏洞; 2、函數(shù)返回本地變量指針,但該變量只在函數(shù)內(nèi)部定義,導(dǎo)致函數(shù)執(zhí)行完后此指針變成無效指針。第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4面向?qū)ο蟮某绦蛟O(shè)計(jì)20/21深層復(fù)制解決賦值“=”的指針懸掛增加自定義賦值運(yùn)算符重載函數(shù)第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4面向?qū)ο蟮某绦蛟O(shè)計(jì)21/21第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4 運(yùn)算符重載 小結(jié) 友元函數(shù)實(shí)現(xiàn) 普

13、通函數(shù)實(shí)現(xiàn) 指針懸掛的解決面向?qū)ο蟮某绦蛟O(shè)計(jì)22/21第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4 類型轉(zhuǎn)換 系統(tǒng)預(yù)定義類型間的轉(zhuǎn)換 隱式類型轉(zhuǎn)換1)賦值表達(dá)式A=B,B先轉(zhuǎn)換成A類型再賦值2)char/short與int運(yùn)算時(shí),轉(zhuǎn)換成int類型3)操作對(duì)象不一致時(shí),級(jí)別低轉(zhuǎn)級(jí)別高類型 顯式類型轉(zhuǎn)換(強(qiáng)制類型轉(zhuǎn)換) 類型名() 如:int(a + b)面向?qū)ο蟮某绦蛟O(shè)計(jì)23/21第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4 類類型與系統(tǒng)預(yù)定義類型間的轉(zhuǎn)換 1、轉(zhuǎn)換構(gòu)造函數(shù)(構(gòu)造函數(shù)實(shí)現(xiàn)數(shù)據(jù)到類轉(zhuǎn)換) 在中定

14、義一個(gè)只有一個(gè)參數(shù)的構(gòu)造函數(shù),參數(shù)是待轉(zhuǎn)換類型的數(shù)據(jù),在函數(shù)體中指定轉(zhuǎn)換的方法。類名(待轉(zhuǎn)換類型的數(shù)據(jù)) 如: Complex(7.7) 面向?qū)ο蟮某绦蛟O(shè)計(jì)24/21第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4 類類型與系統(tǒng)預(yù)定義類型間的轉(zhuǎn)換 2、類型轉(zhuǎn)換函數(shù) 類型轉(zhuǎn)換函數(shù)的作用是將一個(gè)類的對(duì)象轉(zhuǎn)換成另一類型的數(shù)據(jù)。operator 目標(biāo)類型()函數(shù)體 如: double(com);面向?qū)ο蟮某绦蛟O(shè)計(jì)25/21第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4 C+中的強(qiáng)制類型轉(zhuǎn)換 顯示轉(zhuǎn)換(explicit c

15、onversion)也稱強(qiáng)制類型轉(zhuǎn)換,主要包括一下四種強(qiáng)制類型轉(zhuǎn)換操作符: const_cast,字面上理解就是去const屬性。 static_cast,命名上理解是靜態(tài)類型轉(zhuǎn)換。 如int轉(zhuǎn)換成char。 dynamic_cast,命名上理解是動(dòng)態(tài)類型轉(zhuǎn)換。 如子類和父類之間的多態(tài)類型轉(zhuǎn)換。 reinterpreter_cast,僅僅重新解釋類型,但沒有進(jìn)行二進(jìn)制的轉(zhuǎn)換。強(qiáng)制類型轉(zhuǎn)換的一般格式:強(qiáng)制類型轉(zhuǎn)換的一般格式: cast_name(expression)面向?qū)ο蟮某绦蛟O(shè)計(jì)26/21第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4 C+中的強(qiáng)制

16、類型轉(zhuǎn)換 1) static_cast(a)將地址a轉(zhuǎn)換成類型T,T和a必須是指針、引用、算術(shù)類型或枚舉類型。表達(dá)式static_cast(a),a的值轉(zhuǎn)換為模板中指定的類型T。在運(yùn)行時(shí)轉(zhuǎn)換過程中,不進(jìn)行類型檢查來確保轉(zhuǎn)換的安全性。 static_cast它能在內(nèi)置的數(shù)據(jù)類型間互相轉(zhuǎn)換,對(duì)于類只能在有聯(lián)系的指針類型間進(jìn)行轉(zhuǎn)換。可以在繼承體系中把指針轉(zhuǎn)換來、轉(zhuǎn)換去,但是不能轉(zhuǎn)換成繼承體系外的一種類型。面向?qū)ο蟮某绦蛟O(shè)計(jì)27/21第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4 C+中的強(qiáng)制類型轉(zhuǎn)換 2)dynamic_cast(a)完成類層次結(jié)構(gòu)中的提升。

17、T必須是一個(gè)指針、引用或無類型的指針。a必須是決定一個(gè)指針或引用的表達(dá)式。表達(dá)式dynamic_cast(a) 將a值轉(zhuǎn)換為類型為T的對(duì)象指針。如果類型T不是a的某個(gè)基類型,該操作將返回一個(gè)空指針。 與static_cast一樣,dynamic_cast的轉(zhuǎn)換也需要目標(biāo)類型和源對(duì)象有一定的關(guān)系:繼承關(guān)系。 dynamic_cast要比static_cast安全,如果轉(zhuǎn)換不了,dynamic_cast會(huì)返回NULL。面向?qū)ο蟮某绦蛟O(shè)計(jì)28/21第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4 C+中的強(qiáng)制類型轉(zhuǎn)換3) const_cast(a)/b 去掉類

18、型中的常量,除了const或不穩(wěn)定的變址數(shù),T和a必須是相同的類型。表達(dá)式const_cast(a)被用于從一個(gè)類中去除以下這些屬性:const, volatile, 和unaligned。面向?qū)ο蟮某绦蛟O(shè)計(jì)29/21第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4 C+中強(qiáng)制類型轉(zhuǎn)換: 任何指針都可以轉(zhuǎn)換成其它類型的指針,T必須是一個(gè)指針、引用、算術(shù)類型、指向函數(shù)的指針或指向一個(gè)類成員的指針。表達(dá)式reinterpret_cast(a)能夠用于諸如char* 到 int*,或者One_class* 到 Unrelated_class*等類似這樣的轉(zhuǎn)換,

19、因此可能是不安全的。面向?qū)ο蟮某绦蛟O(shè)計(jì)30/21第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4 類型轉(zhuǎn)換 構(gòu)造函數(shù)實(shí)現(xiàn)的賦值“=” 強(qiáng)制類型轉(zhuǎn)換面向?qū)ο蟮某绦蛟O(shè)計(jì)31/21第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4 虛函數(shù) 多態(tài)從實(shí)現(xiàn)的角度來講可以劃分為兩類:編譯時(shí)的多態(tài)和運(yùn)行時(shí)的多態(tài)。 編譯時(shí)的多態(tài)是通過靜態(tài)聯(lián)編來實(shí)現(xiàn)的。靜態(tài)聯(lián)編就是在編譯階段完成的聯(lián)編。編譯時(shí)多態(tài)性主要是通過函數(shù)重載和運(yùn)算符重載實(shí)現(xiàn)的。 運(yùn)行時(shí)的多態(tài)是用動(dòng)態(tài)聯(lián)編實(shí)現(xiàn)的。動(dòng)態(tài)聯(lián)編是運(yùn)行階段完成的聯(lián)編。運(yùn)行時(shí)多態(tài)性主要是通過虛函數(shù)虛函數(shù)來實(shí)

20、現(xiàn)的。 面向?qū)ο蟮某绦蛟O(shè)計(jì)32/21第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4 虛函數(shù) 虛函數(shù)提供了一種更為靈活的多態(tài)性機(jī)制。虛函數(shù)允許函數(shù)調(diào)用與函數(shù)體之間的聯(lián)系在運(yùn)行時(shí)才建立,也就是在運(yùn)行時(shí)才決定如何動(dòng)作,即所謂的動(dòng)態(tài)聯(lián)編。 面向?qū)ο蟮某绦蛟O(shè)計(jì)33/21第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4 虛函數(shù)的引入 C+規(guī)定:基類的對(duì)象指針可以指向它的公有派生的對(duì)象,但是當(dāng)其指向公有派生類對(duì)象時(shí),只能訪問派生類中從基類繼承來的成員,而不能訪問公有派生類中定義的成員。面向?qū)ο蟮某绦蛟O(shè)計(jì)34/21第五章、多態(tài)性

21、第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4 虛函數(shù)的作用和定義(1) 虛函數(shù)同派生類的結(jié)合可使C+支持運(yùn)行時(shí)的多態(tài)性,實(shí)現(xiàn)了在基類定義派生類所擁有的通用接口,而在派生類定義具體的實(shí)現(xiàn)方法,即常說的“同一接口,多種方法”,它幫助程序員處理越來越復(fù)雜的程序。面向?qū)ο蟮某绦蛟O(shè)計(jì)35/21第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4 虛函數(shù)的定義和作用(2)面向?qū)ο蟮某绦蛟O(shè)計(jì)36/21第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4 虛函數(shù)的定義和作用(3) 定義虛函數(shù)的方法如下: vi

22、rtual 函數(shù)類型 函數(shù)名(形參表) / 函數(shù)體 如果在基類中聲明虛成員函數(shù),則在所有派生類中該函數(shù)都是虛函數(shù),即使在派生類中聲明該函數(shù)時(shí)沒有使用關(guān)鍵字virtual。 當(dāng)使用基類指針或引用調(diào)用虛成員函數(shù)時(shí),實(shí)際調(diào)用的是指針指向的具體對(duì)象所屬類中定義(覆蓋)的成員函數(shù)。這種函數(shù)調(diào)用方式稱為多態(tài)調(diào)用。 面向?qū)ο蟮某绦蛟O(shè)計(jì)37/21第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4 虛函數(shù)的定義與作用(4) 注意:虛函數(shù)的聲明應(yīng)該放在基類中,如果只在派生類中將成員函數(shù)聲明為虛函數(shù),則即使基類指針實(shí)際指向的是派生類的對(duì)象,也不能通過該指針調(diào)用派生類中的虛成員函

23、數(shù)。如果想在某個(gè)類層次中實(shí)現(xiàn)多態(tài),則應(yīng)該在這個(gè)層次中的基類里聲明虛函數(shù)。 說明: 不能將類的靜態(tài)成員函數(shù)聲明為虛函數(shù) ; 不能將類的構(gòu)造函數(shù)聲明為虛函數(shù); 應(yīng)該把類的析構(gòu)函數(shù)聲明為虛函數(shù)。面向?qū)ο蟮某绦蛟O(shè)計(jì)38/21第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4 虛函數(shù)與動(dòng)態(tài)綁定(1) 為什么只有虛成員函數(shù)才能實(shí)現(xiàn)多態(tài)調(diào)用呢?這是由編譯器處理函數(shù)調(diào)用的方式?jīng)Q定的。非虛函數(shù)的調(diào)用方式為靜態(tài)綁定靜態(tài)綁定,而虛函數(shù)的調(diào)用方式為動(dòng)態(tài)綁動(dòng)態(tài)綁定定。 綁定是指將函數(shù)調(diào)用和實(shí)際的函數(shù)相連接的過程。分為靜態(tài)綁定和動(dòng)態(tài)綁定。 面向?qū)ο蟮某绦蛟O(shè)計(jì)39/21第五章、多態(tài)性第五章、多態(tài)性多態(tài)性概念5.1運(yùn)算符重載5.2類型轉(zhuǎn)換5.3 虛函數(shù)5.4 虛函數(shù)與動(dòng)態(tài)綁定(2) 靜態(tài)綁定是在程序編譯時(shí),就確定要調(diào)用的函數(shù),并用函數(shù)的相對(duì)地址直接調(diào)用函數(shù),所以靜態(tài)綁定又被稱為編譯期綁定或前期綁定。 動(dòng)態(tài)綁定是指,在程序編譯期無法確定要調(diào)用的函數(shù),在程序的運(yùn)行過程中,根據(jù)調(diào)用函數(shù)的指針或引用變量所引用的對(duì)象的具體類型動(dòng)態(tài)地確定要調(diào)用的函數(shù)。所以動(dòng)態(tài)綁定又被稱為運(yùn)行期綁定或后期綁定。C+中的虛成員函數(shù)使用動(dòng)態(tài)綁定方式進(jìn)行調(diào)用

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論