資源描述:
《接口實(shí)現(xiàn)和繼承實(shí)現(xiàn)》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。
1、[C++]接口繼承與實(shí)現(xiàn)繼承?接口繼承與實(shí)現(xiàn)繼承所謂接口繼承,就是派生類只繼承函數(shù)的接口,也就是聲明;而實(shí)現(xiàn)繼承,就是派生類同時(shí)繼承函數(shù)的接口和實(shí)現(xiàn)。我們都很清楚C++中有幾個(gè)基本的概念,虛函數(shù)、純虛函數(shù)、非虛函數(shù)。虛函數(shù):虛函數(shù)是指一個(gè)類中你希望重載的成員函數(shù),當(dāng)你用一個(gè)基類指針或引用指向一個(gè)繼承類對(duì)象的時(shí)候,你調(diào)用一個(gè)虛函數(shù),實(shí)際調(diào)用的是繼承類的版本?!狹SDN虛函數(shù)用來表現(xiàn)基類和派生類的成員函數(shù)之間的一種關(guān)系.?虛函數(shù)的定義在基類中進(jìn)行,在需要定義為虛函數(shù)的成員函數(shù)的聲明前冠以關(guān)鍵字?virtual.?基類中的某個(gè)成
2、員函數(shù)被聲明為虛函數(shù)后,此虛函數(shù)就可以在一個(gè)或多個(gè)派生類中被重新定義.?在派生類中重新定義時(shí),其函數(shù)原型,包括返回類型,函數(shù)名,參數(shù)個(gè)數(shù),參數(shù)類型及參數(shù)的先后順序,都必須與基類中的原型完全相同.?虛函數(shù)是重載的一種表現(xiàn)形式,是一種動(dòng)態(tài)的重載方式.純虛函數(shù):純虛函數(shù)在基類中沒有定義,它們被初始化為0。?任何用純虛函數(shù)派生的類,都要自己提供該函數(shù)的具體實(shí)現(xiàn)。?定義純虛函數(shù)?virtualvoidfun(void)=0;非虛函數(shù):一般成員函數(shù),無virtual關(guān)鍵字修飾。?至于為什么要定義這些函數(shù),我們可以將虛函數(shù)、純虛函數(shù)和非虛
3、函數(shù)的功能與接口繼承與實(shí)現(xiàn)繼承聯(lián)系起來:聲明一個(gè)純虛函數(shù)(purevirtual)的目的是為了讓派生類只繼承函數(shù)接口,也就是上面說的接口繼承。純虛函數(shù)一般是在不方便具體實(shí)現(xiàn)此函數(shù)的情況下使用。也就是說基類無法為繼承類規(guī)定一個(gè)統(tǒng)一的缺省操作,但繼承類又必須含有這個(gè)函數(shù)接口,并對(duì)其分別實(shí)現(xiàn)。但是,在C++中,我們是可以為純虛函數(shù)提供定義的,只不過這種定義對(duì)繼承類來說沒有特定的意義。因?yàn)槔^承類仍然要根據(jù)各自需要實(shí)現(xiàn)函數(shù)。通俗說,純虛函數(shù)就是要求其繼承類必須含有該函數(shù)接口,并對(duì)其進(jìn)行實(shí)現(xiàn)。是對(duì)繼承類的一種接口實(shí)現(xiàn)要求,但并不提供缺省
4、操作,各個(gè)繼承類必須分別實(shí)現(xiàn)自己的操作。聲明非純虛函數(shù)(impurevirtual)的目的是讓繼承類繼承該函數(shù)的接口和缺省實(shí)現(xiàn)。與純虛函數(shù)唯一的不同就是其為繼承類提供了缺省操作,繼承類可以不實(shí)現(xiàn)自己的操作而采用基類提供的默認(rèn)操作。聲明非虛函數(shù)(non-virtual)的目的是為了令繼承類繼承函數(shù)接口及一份強(qiáng)制性實(shí)現(xiàn)。相對(duì)于虛函數(shù)來說,非虛函數(shù)對(duì)繼承類要求的更為嚴(yán)格,繼承類不僅要繼承函數(shù)接口,而且也要繼承函數(shù)實(shí)現(xiàn)。也就是為繼承類定義了一種行為。?總結(jié):純虛函數(shù):要求繼承類必須含有某個(gè)接口,并對(duì)接口函數(shù)實(shí)現(xiàn)。虛函數(shù):繼承類必須含
5、有某個(gè)接口,可以自己實(shí)現(xiàn),也可以不實(shí)現(xiàn),而采用基類定義的缺省實(shí)現(xiàn)。非虛函數(shù):繼承類必須含有某個(gè)接口,必須使用基類的實(shí)現(xiàn)。C++箴言:接口繼承和實(shí)現(xiàn)繼承 (public)inheritance這個(gè)表面上簡(jiǎn)單易懂的觀念,一旦被近距離審視,就會(huì)被證明是由兩個(gè)相互獨(dú)立的部分組成的:inheritanceoffunctioninterfaces(函數(shù)接口的繼承)和inheritanceoffunctionimplementations(函數(shù)實(shí)現(xiàn)的繼承)。這兩種inheritance之間的差異正好符合本書Introduction中論述的
6、functiondeclarations(函數(shù)聲明)和functiondefinitions(函數(shù)定義)之間的差異。? 作為一個(gè)class的設(shè)計(jì)者,有的時(shí)候你想要derivedclasses只繼承一個(gè)memberfunction的interface(declaration)。有的時(shí)候你想要derivedclasses既繼承interface(接口)也繼承implementation(實(shí)現(xiàn)),但你要允許它們替換他們繼承到的implementation。還有的時(shí)候你想要derivedclasses繼承一個(gè)函數(shù)的interfac
7、e(接口)和implementation(實(shí)現(xiàn)),而不允許它們替換任何東西。? 為了更好地感覺這些選擇之間的不同之處,考慮一個(gè)在圖形應(yīng)用程序中表示幾何圖形的classhierarchy(類繼承體系):? classShape{? public:? virtualvoiddraw()const=0;? virtualvoiderror(conststd::string&msg);? intobjectID()const;? ...? };? classRectangle:publicShape{...};?
8、 classEllipse:publicShape{...};? Shape是一個(gè)abstractclass(抽象類),它的purevirtualfunction(純虛擬函數(shù))表明了這一點(diǎn)。作為結(jié)果,客戶不能創(chuàng)建Shapeclass的實(shí)例,只能創(chuàng)建從它繼承的classes的實(shí)例。但是,S