面向?qū)ο缶幊碳夹g(shù)與方法(C++) 課件 第7-9章 多態(tài)、模板、異常處理_第1頁
面向?qū)ο缶幊碳夹g(shù)與方法(C++) 課件 第7-9章 多態(tài)、模板、異常處理_第2頁
面向?qū)ο缶幊碳夹g(shù)與方法(C++) 課件 第7-9章 多態(tài)、模板、異常處理_第3頁
面向?qū)ο缶幊碳夹g(shù)與方法(C++) 課件 第7-9章 多態(tài)、模板、異常處理_第4頁
面向?qū)ο缶幊碳夹g(shù)與方法(C++) 課件 第7-9章 多態(tài)、模板、異常處理_第5頁
已閱讀5頁,還剩84頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

面向?qū)ο缶幊碳夹g(shù)與方法(C++)

第7章多態(tài)第7章多態(tài)第7章

多態(tài)

7.1多態(tài)性概述

7.2虛函數(shù)

7.2.1虛函數(shù)的聲明與應(yīng)用

7.2.2虛析構(gòu)函數(shù)

7.3如何實現(xiàn)動態(tài)綁定

7.4純虛函數(shù)與抽象類

7.5小結(jié)

第7章多態(tài)7.1多態(tài)性概述

7.2虛函數(shù) 7.3如何實現(xiàn)動態(tài)綁定 7.4純虛函數(shù)與抽象類 7.5小結(jié)

第7章多態(tài)7.1多態(tài)性概述對于重載函數(shù),在調(diào)用函數(shù)處,編譯器能夠根據(jù)類型匹配情況確定要調(diào)用哪個函數(shù)。這個工作是在編譯連接階段進(jìn)行的,稱為靜態(tài)綁定(staticbinding)或早期綁定(earlybinding)。面向?qū)ο蠖鄳B(tài)(polymorphism)的目的,是讓處理基類對象的程序代碼,能夠處理派生類對象?;蛘哒f,對于同樣的消息(函數(shù)調(diào)用),被不同類型對象接收時導(dǎo)致不同的行為。這個功能是通過虛函數(shù)實現(xiàn)的。虛函數(shù)機(jī)制使得函數(shù)調(diào)用與函數(shù)體的聯(lián)系可以在程序運行時確定,這稱為動態(tài)綁定(dynamicbinding),又稱為晚期綁定或運行時綁定。第7章多態(tài)7.1多態(tài)性概述 7.2虛函數(shù)

7.3如何實現(xiàn)動態(tài)綁定 7.4純虛函數(shù)與抽象類 7.5小結(jié)

第7章多態(tài)7.2虛函數(shù)7.2.1虛函數(shù)的聲明與應(yīng)用將一個成員函數(shù)聲明為虛函數(shù),就是在前面添加關(guān)鍵字virtual。第7章多態(tài)這種在派生類中對virtual函數(shù)的再定義,稱為重寫(overriding),注意要與函數(shù)重載(overloading)與第6章中的函數(shù)同名屏蔽區(qū)分開。由于虛機(jī)制的存在,程序在運行時根據(jù)對象的類型去調(diào)用合適的成員函數(shù)。這樣的程序結(jié)構(gòu)具有很好的可擴(kuò)展性。例如可以在基類的基礎(chǔ)上派生出任意的新類型,而函數(shù)test()不需做任何改變就可用于新類型的對象。1. 虛函數(shù)是成員函數(shù),但不會是靜態(tài)成員函數(shù)。2. 如果虛函數(shù)定義在類體外,則關(guān)鍵字virtual只能出現(xiàn)在類內(nèi)的函數(shù)聲明前。當(dāng)使用作用域運算符“::”時,虛機(jī)制不再起作用。派生類中的對應(yīng)函數(shù)接口必須與基類中的完全相同。對函數(shù)返回類型可以稍微放松要求,如果基類中的虛函數(shù)返回類型是A*(或A&),派生類中重寫的函數(shù)可以返回B*(或B&),其中B是A的public派生類。如果不滿足這些要求,則派生類中的同名函數(shù)就不是對基類虛函數(shù)的重寫,而是重新定義的一個函數(shù),即使帶有關(guān)鍵字virtual也是如此。如果原函數(shù)有默認(rèn)形參值,就不要在派生類中再定義新的形參值。因為默認(rèn)形參值是靜態(tài)綁定的,只能來自基類中的定義。在多層次繼承中,如果派生類沒有對基類的虛函數(shù)進(jìn)行重寫,則自動調(diào)用繼承層次中最近的虛函數(shù)。使用虛函數(shù)時應(yīng)注意以下幾點:第7章多態(tài)要想實現(xiàn)運行時的多態(tài),必須滿足三個基本條件:1)public繼承;2)虛函數(shù);3)通過指針(或引用)調(diào)用虛函數(shù)。第7章多態(tài)運行結(jié)果:Graduate::Show()Graduate::Show()UnivPerson::Show()Student::Study()Student::Eat()Graduate::Eat()Student::Study()Graduate::Show()第7章多態(tài)7.2虛函數(shù)7.2.2虛析構(gòu)函數(shù)構(gòu)造函數(shù)不能為虛函數(shù),而析構(gòu)函數(shù)可以是虛函數(shù)。如果基類的析構(gòu)函數(shù)是虛函數(shù),則所有派生類的析構(gòu)函數(shù)都自動為虛函數(shù)。將析構(gòu)函數(shù)聲明為虛函數(shù),可以使程序運行更加安全。運行結(jié)果:ConstructorofCPoint.ConstructorofRectangle.DestructorofCPoint.改成虛析構(gòu)函數(shù)后的運行結(jié)果:ConstructorofCPoint.ConstructorofRectangle.DestructorofRectangle.DestructorofCPoint.第7章多態(tài)7.1多態(tài)性概述 7.2虛函數(shù) 7.3如何實現(xiàn)動態(tài)綁定

7.4純虛函數(shù)與抽象類 7.5小結(jié)

第7章多態(tài)7.3如何實現(xiàn)動態(tài)綁定對于含虛函數(shù)的類,編譯器為每個類建立唯一的虛函數(shù)表vtable,表中存放該類的虛函數(shù)的地址,包括新聲明的以及繼承的虛函數(shù)。編譯器還為每個類加上一個數(shù)據(jù)成員vptr,這是一個指向虛函數(shù)表的指針。虛函數(shù)表中的順序,與類中虛函數(shù)的聲明順序一致。派生類會繼承基類的虛函數(shù)表,當(dāng)在派生類中重寫虛函數(shù)時,表中元素存儲的地址將不再是基類虛函數(shù)的地址,而是派生類虛函數(shù)的地址。classA{public: intdata1; voidfun1(){} virtualvoidvfun1(){} virtualvoidvfun2(){}};

第7章多態(tài)classB:publicA{public: intdata2; voidfun1(){} virtualvoidvfun2(){}};第7章多態(tài)7.1多態(tài)性概述 7.2虛函數(shù) 7.3如何實現(xiàn)動態(tài)綁定 7.4純虛函數(shù)與抽象類7.5小結(jié)

第7章多態(tài)7.4純虛函數(shù)與抽象類在“形狀-點-圓-球”這樣的繼承關(guān)系中,“形狀”是比較抽象的概念,無法為其定義求面積的函數(shù),但可以在基類中聲明一個統(tǒng)一接口,在派生類中再給出求面積的實現(xiàn)。這樣的虛函數(shù)稱為純虛函數(shù):

virtual返回類型函數(shù)名(參數(shù)列表)=0; 注意純虛函數(shù)聲明中沒有函數(shù)體,與函數(shù)定義不同: virtualdoubleArea(){}含有純虛函數(shù)的類稱為抽象類。不能定義抽象類的對象,可以聲明抽象類引用或指向抽象類的指針。在抽象類基礎(chǔ)上派生出的新類,如果給出了所有純虛函數(shù)的實現(xiàn),就不再是抽象類,否則仍是抽象類。運行結(jié)果:50.265412.5664第7章多態(tài)7.1多態(tài)性概述 7.2虛函數(shù) 7.3如何實現(xiàn)動態(tài)綁定 7.4純虛函數(shù)與抽象類 7.5小結(jié)

第7章多態(tài)7.5小結(jié)虛函數(shù)是用virtual關(guān)鍵字聲明的非靜態(tài)成員函數(shù)。虛函數(shù)機(jī)制使得函數(shù)調(diào)用與函數(shù)體的聯(lián)系可以在程序運行時確定。要想實現(xiàn)運行時的多態(tài),必須滿足三個條件:1)public繼承;2)虛函數(shù);3)通過指針(或引用)調(diào)用虛函數(shù)。構(gòu)造函數(shù)不能是虛函數(shù),析構(gòu)函數(shù)可以是虛函數(shù),而且常常被聲明為虛函數(shù)。對于含虛函數(shù)的類,編譯器為每個類建立一個虛函數(shù)表,表中存放該類虛函數(shù)的地址。編譯器還為每個類添加指針成員vptr,指向虛函數(shù)表。程序運行時,通過對象的vptr找到虛函數(shù)表,再找到虛函數(shù)的真正地址,從而實現(xiàn)動態(tài)綁定。含有純虛函數(shù)的類稱為抽象類。不能定義抽象類的對象。抽象類只能作為基類。THANKS面向?qū)ο缶幊碳夹g(shù)與方法(C++)

第8章模板第8章模板第8章

模板

8.1函數(shù)模板

8.1.1函數(shù)模板的定義與使用

8.1.2函數(shù)模板重載

8.1.3函數(shù)模板專門化

8.1.4使用標(biāo)準(zhǔn)庫中的函數(shù)模板

8.2類模板

8.2.1類模板的定義與使用

8.2.2類模板專門化

8.2.3作為函數(shù)的參數(shù)及返回類型

8.2.4使用標(biāo)準(zhǔn)庫中的類模板

8.2.5類模板的繼承與派生

8.3小結(jié)

第8章模板8.1函數(shù)模板8.1.1函數(shù)模板的定義與使用

8.1.2函數(shù)模板重載 8.1.3函數(shù)模板專門化 8.1.4使用標(biāo)準(zhǔn)庫中的函數(shù)模板第8章模板8.1函數(shù)模板8.1.1函數(shù)模板的定義與使用 函數(shù)重載將參數(shù)不同、功能類似的函數(shù)定義相同的名字,使用戶感到含義清楚。但是對于函數(shù)設(shè)計者而言,仍要分別定義每個函數(shù)。對于功能相同、數(shù)據(jù)類型不同的函數(shù),能不能只編寫一次源代碼呢?第8章模板可以定義一個函數(shù),它的返回類型或形參類型(部分或全部)不具體指定,而用一個或多個抽象的類型參數(shù)來表示,這種函數(shù)形式就稱為函數(shù)模板。在調(diào)用函數(shù)處,編譯器會用具體的實參類型代替抽象的類型參數(shù),這個過程稱為實例化。第8章模板//例8-1.求兩數(shù)之和的函數(shù)模板#include<iostream>usingnamespacestd;template<typenameT>//T為類型參數(shù)T

add(Tx,Ty){return(x+y);}

intmain(){ doubled1=0.5,d2=8.8;cout<<add(2,3)<<“,”;//T→int.或add<int>(2,3)cout<<add(d1,d2)<<endl;//T→double.或 //add<double>(d1,d2)return0;}函數(shù)模板并不是一個真正的函數(shù)。程序編譯時,編譯器根據(jù)調(diào)用語句中的實參類型對函數(shù)模板實例化,生成一個具體的可運行的函數(shù)。例如,編譯add(2,3)時,編譯器發(fā)現(xiàn)2和3是int型,于是使用如下版本的函數(shù):

intadd(intx,inty){return(x+y);}編譯add(d1,d2)時,編譯器發(fā)現(xiàn)d1和d2是double型,于是使用如下版本的函數(shù): doubleadd(doublex,doubley){return(x+y);}函數(shù)模板的形參列表中也可以帶其他類型的參數(shù)。第8章模板運行結(jié)果:11.210第8章模板8.1函數(shù)模板8.1.1函數(shù)模板的定義與使用 8.1.2函數(shù)模板重載

8.1.3函數(shù)模板專門化 8.1.4使用標(biāo)準(zhǔn)庫中的函數(shù)模板第8章模板8.1.2函數(shù)模板重載 函數(shù)模板也可以重載。編譯器通過匹配過程,可以正確決定應(yīng)該調(diào)用哪個函數(shù)形式。當(dāng)程序中同時重載有函數(shù)模板和非模板函數(shù)時,編譯器會優(yōu)先選用非模板函數(shù),當(dāng)然前提是類型最佳匹配。如果一個調(diào)用有多于一個的匹配選擇,則說明函數(shù)或函數(shù)模板在定義時存在歧義,編譯時將會出錯。8.1函數(shù)模板運行結(jié)果:4.4,4.4,8.8Dr第8章模板8.1函數(shù)模板8.1.1函數(shù)模板的定義與使用 8.1.2函數(shù)模板重載 8.1.3函數(shù)模板專門化

8.1.4使用標(biāo)準(zhǔn)庫中的函數(shù)模板第8章模板8.1.3函數(shù)模板專門化 使用函數(shù)模板,編譯器會根據(jù)實參類型自動將模板實例化,即用具體的數(shù)據(jù)類型代替類型參數(shù)。C++也提供一種將模板顯性專門化的語法。即定義函數(shù)時,使用前綴“template<>”,后面是針對具體類型的函數(shù)定義:

template<> stringLarger<string>(stringx1,stringx2) {return(x1>x2)?X1:x2;}“template<>”的目的是告訴編譯器,當(dāng)數(shù)據(jù)類型為string時選用專門化的定義形式。其中函數(shù)名后面<string>可以省略。8.1函數(shù)模板運行結(jié)果:5.5template<>string-b2第8章模板8.1函數(shù)模板8.1.1函數(shù)模板的定義與使用 8.1.2函數(shù)模板重載 8.1.3函數(shù)模板專門化 8.1.4使用標(biāo)準(zhǔn)庫中的函數(shù)模板第8章模板8.1.4使用標(biāo)準(zhǔn)庫中的函數(shù)模板 C++標(biāo)準(zhǔn)庫中的算法函數(shù)基本上都是模板,適用于數(shù)組等容器類型,編程時可以直接使用,但要#include相應(yīng)的頭文件。主要的頭文件有<algorithm>、<utility>、<functional>、<numeric>等。下例演示如何使用標(biāo)準(zhǔn)庫中定義的泛型函數(shù),進(jìn)行數(shù)組元素排序、復(fù)制、輸出等操作。8.1函數(shù)模板運行結(jié)果:1.14.42.23.31.12.23.34.44.43.32.21.1第8章模板8.2類模板8.2.1類模板的定義與使用8.2.2類模板專門化 8.2.3作為函數(shù)的參數(shù)及返回類型 8.2.4使用標(biāo)準(zhǔn)庫中的類模板 8.2.5類模板的繼承與派生第8章模板8.2類模板8.2.1類模板的定義與使用 第8章模板類模板就像一個能裝水、油等的容器,適用于多種數(shù)據(jù)類型。

template<typenameT1,typenameT2>

類定義在建立類對象處,編譯器會用實際數(shù)據(jù)類型代替類模板中的類型參數(shù),形成模板類,這是一個實例化的過程。一般來說,為了確保在每個必須實例化類模板的文件中都有類模板的定義,類模板定義應(yīng)該放在頭文件中。類模板的成員函數(shù)都是函數(shù)模板。運行結(jié)果:9,8,7,6,5,4,3,2,1,0,3.14第8章模板8.2類模板8.2.1類模板的定義與使用8.2.2類模板專門化

8.2.3作為函數(shù)的參數(shù)及返回類型 8.2.4使用標(biāo)準(zhǔn)庫中的類模板 8.2.5類模板的繼承與派生第8章模板8.2類模板8.2.2類模板的專門化 像函數(shù)模板一樣,類模板也可以使用前綴template<>進(jìn)行專門化定義。下例,要求產(chǎn)生int、double型的模板類時,使用類模板TStack進(jìn)行實例化;當(dāng)產(chǎn)生string型棧時,使用專門化的定義。運行結(jié)果:9,8,7,6,5,4,3,2,1,0,3.14template<>C++第8章模板8.2類模板8.2.1類模板的定義與使用8.2.2類模板專門化 8.2.3作為函數(shù)的參數(shù)及返回類型

8.2.4使用標(biāo)準(zhǔn)庫中的類模板 8.2.5類模板的繼承與派生第8章模板8.2類模板8.2.3作為函數(shù)的參數(shù)及返回類型 任何數(shù)據(jù)類型,包括用戶自定義的類或類模板,都可以作為函數(shù)(模板)的參數(shù)和返回類型。例8-10求數(shù)組元素的最大/最小值及其索引:第8章模板8.2類模板8.2.1類模板的定義與使用8.2.2類模板專門化 8.2.3作為函數(shù)的參數(shù)及返回類型 8.2.4使用標(biāo)準(zhǔn)庫中的類模板

8.2.5類模板的繼承與派生第8章模板8.2類模板8.2.4使用標(biāo)準(zhǔn)庫中的類模板 前面我們定義了一個簡單的棧類模板TStack。實際上C++標(biāo)準(zhǔn)庫已經(jīng)為我們定義了一個棧類模板stack,使用時只要包含頭文件<stack>即可。C++標(biāo)準(zhǔn)庫中的類型大部分以模板的形式定義。運行結(jié)果:9876543210第8章模板8.2類模板8.2.1類模板的定義與使用8.2.2類模板專門化 8.2.3作為函數(shù)的參數(shù)及返回類型 8.2.4使用標(biāo)準(zhǔn)庫中的類模板 8.2.5類模板的繼承與派生第8章模板8.2類模板8.2.5類模板的繼承與派生 運行結(jié)果:4,52.5,3.5radius=2.52,3radius=2第8章模板8.3小結(jié)模板將數(shù)據(jù)類型參數(shù)化,為我們提供一種源代碼重用方法。對于功能相同而數(shù)據(jù)類型不同的操作,可以定義一個通用函數(shù)模板,在調(diào)用函數(shù)處編譯器會用實參的類型代替函數(shù)模板中的類型參數(shù),這個過程稱為實例化。函數(shù)模板可以重載。同樣可以定義適用于多種數(shù)據(jù)類型的類模板,類模板的成員函數(shù)都是函數(shù)模板。在創(chuàng)建類對象的地方,編譯器會用實際數(shù)據(jù)類型代替類模板中的類型參數(shù),實例化為模板類。類模板可以使用友元,也可以繼承與派生,其基類和派生類可以是模板、也可以不是模板。在多文件程序中,模板(包括函數(shù)模板和類模板)的定義應(yīng)該放在頭文件中,以防出現(xiàn)連接錯誤。THANKS面向?qū)ο缶幊碳夹g(shù)與方法(C++)

第9章異常處理第9章異常處理第9章

異常處理

9.1異常處理概述

9.2異常處理的實現(xiàn)

9.3帶異常聲明的函數(shù)

9.4成員函數(shù)拋出異常

9.4.1一般成員函數(shù)拋出異常

9.4.2構(gòu)造函數(shù)拋出異常

9.4.3析構(gòu)函數(shù)拋出異常

9.5標(biāo)準(zhǔn)庫中的異常類型

9.6小結(jié)

第9章異常處理9.1異常處理概述9.2異常處理的實現(xiàn) 9.3帶異常聲明的函數(shù) 9.4成員函數(shù)拋出異常 9.5標(biāo)準(zhǔn)庫中的異常類型 9.6小結(jié)

第9章異常處理9.1異常處理概述正常終止一個程序是從主函數(shù)返回。其他:從函數(shù)執(zhí)行return語句返回,調(diào)用exit()和abort(),使用調(diào)試宏assert(表達(dá)式)。voidexit(intstatus);//刪除使用的內(nèi)存空間后返回系統(tǒng)voidabort(void);//立即終止程序voidassert(expression);//調(diào)試宏,false終止程序軟件應(yīng)具有健壯性。軟件不僅在正常情況下能夠正確運行,在非正常情況下也要具有合理的表現(xiàn)。例如,當(dāng)出現(xiàn)用戶誤操作、內(nèi)存空間不足、外部設(shè)備或文件連接不正確等異常情況時,程序應(yīng)能夠做出適當(dāng)處理,而不能出現(xiàn)死機(jī)、丟失數(shù)據(jù)或其他災(zāi)難性的后果。C++處理異常情況的基本思想是將異常檢測與異常處理分離。第9章異常處理9.1異常處理概述9.2異常處理的實現(xiàn)

9.3帶異常聲明的函數(shù) 9.4成員函數(shù)拋出異常 9.5標(biāo)準(zhǔn)庫中的異常類型 9.6小結(jié)

第9章異常處理9.2異常處理的實現(xiàn)處理異常的功能通過try、throw、catch三個部分實現(xiàn)。任何需要檢測異常的語句都放在try模塊中,出現(xiàn)異常時由throw語句拋出一個異常信息,由緊跟在try模塊后面的catch語句捕捉并進(jìn)行相應(yīng)的處理。try與catch總是結(jié)合使用的。一個try模塊可與多個catch語句(稱為異常處理器)聯(lián)系,每個catch語句處理一種類型的異常信息。運行結(jié)果:afterthrowinDiv().5.5/1.1=1doubleexception:0.5main()end.第9章異常處理9.1異常處理概述9.2異常處理的實現(xiàn) 9.3帶異常聲明的函數(shù)

9.4成員函數(shù)拋出異常 9.5標(biāo)準(zhǔn)庫中的異常類型 9.6小結(jié)

第9章異常處理9.3帶異常聲明的函數(shù)調(diào)用一個函數(shù)時,如果該函數(shù)可能拋出異常,我們希望通過函數(shù)接口就能夠看到異常的類型,以增強(qiáng)可讀性,并方便用戶設(shè)計異常處理程序。異常聲明跟隨在函數(shù)參數(shù)列表之后,通過關(guān)鍵字throw來指定。例如下面帶異常聲明的函數(shù)原型形式,其中T表示函數(shù)返回類型,list表示函數(shù)形參表,fun表示函數(shù)名。

Tfun(list)throw(); //聲明該函數(shù)不拋出異常

Tfun(list);//聲明該函數(shù)可拋出任意類型的異常

//聲明下面函數(shù)可拋出T1,T2類型的異常

Tfun(list)throw(T1,T2);運行結(jié)果:intexception:1main()end.第9章異常處理9.1異常處理概述9.2異常處理的實現(xiàn) 9.3帶異常聲明的函數(shù) 9.4成員函數(shù)拋出異常

9.5標(biāo)準(zhǔn)庫中的異常類型 9.6小結(jié)

第9章異常處理9.4成員函數(shù)拋出異常

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論