第17章-類的繼承_第1頁
第17章-類的繼承_第2頁
第17章-類的繼承_第3頁
第17章-類的繼承_第4頁
第17章-類的繼承_第5頁
已閱讀5頁,還剩41頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第17章類的繼承

面向?qū)ο蟮某绦蛟O(shè)計方法提供了這樣一種機制,即一個類可以從另一個類獲得部分或全部屬性。把這種機制稱為繼承(inheritance)。前者稱為子類(childclass)或派生類(derivedclass),后者稱為父類(parentclass)或基類(baseclass)。

繼承17.1繼承機制中的初始化17.2多重繼承17.3虛基類17.4小結(jié)17.517.1繼承

17.1.1繼承與派生類通過繼承產(chǎn)生的新類就叫派生類或子類。被繼承的類就叫基類或父類。

類的繼承與派生概念反映了客觀世界中事物一般與特殊的關(guān)系,上下的層次關(guān)系,抽象與具體的關(guān)系?;愂桥缮惖某橄竺枋?,派生類是基類的特例。

從編程技術(shù)的角度看,繼承機制提供了代碼重用的手段。一旦聲明為派生類,就可以直接使用(訪問)基類的公有和保護性質(zhì)的數(shù)據(jù)成員與成員函數(shù)。

一個派生類既可以從一個基類派生,也可以從多個基類派生。從一個基類派生叫做單繼承,從多個基類派生叫做多重繼承。本節(jié)將介紹單繼承。

從已有的類(基類)派生出一個新類(派生類)的定義格式是:class派生類名:繼承方式基類名{

private:

派生類新成員

protected:

派生類新成員

public:

派生類新成員};

繼承方式用于規(guī)定基類成員在派生類中的訪問權(quán)限,因此繼承方式又稱為訪問控制或訪問方式。繼承方式可使用關(guān)鍵字public或private說明。

訪問控制使用關(guān)鍵字public說明時,稱為公有繼承或公有派生。訪問控制使用關(guān)鍵字private說明時,稱為私有繼承或私有派生。如果繼承方式說明被省略,則隱含為private,即私有繼承。

引入繼承與派生的概念后,在類的成員中,出現(xiàn)了一種新的類成員:protected成員,稱為保護成員。我們知道,在類中被指定為public的成員,能被程序的其他部分訪問。

被指定為private的成員,只能被該類的成函數(shù)或友元函數(shù)訪問。而被指定為protected的成員,也是只能被該類的成員函數(shù)或友元函數(shù)訪問(相當于private成員),但在繼承方面有所不同。派生類也是不能訪問基類的私有成員。

但是,可以訪問基類的protected成員。所以,在基類說明為保護的成員,可繼承為派生類的成員。

無論是公有派生還是私有派生,基類的私有成員在派生類都是不能訪問的。繼承方式只是影響基類的公有成員和保護成員。下面分別討論公有派生和私有派生。

17.1.2公有派生公有派生也稱為公有繼承。在公有派生的情況下,派生類可以訪問基類中的公有和保護成員,不能訪問基類的私有成員。

17.1.3私有派生當派生類采用私有繼承方式(關(guān)鍵字為private)時,即為私有派生。這時,基類的所有public成員和protected成員被繼承為派生類的private成員。

派生類的成員可以把它們作為自己私有成員來訪問。在派生類之外無法通過派生類的對象訪問它們。在基類被說明為private的成員,派生類的成員不能訪問它們。也就是說,派生類不能繼承基類的private成員。

經(jīng)過私有繼承后,基類的公有成員和保護成員都成為派生類的private成員。17.2繼承機制中的初始化

基類的構(gòu)造函數(shù)和析構(gòu)函數(shù)是不能繼承的。如果對從基類派生來的成員初始化,還必須由基類的構(gòu)造函數(shù)來完成。

派生類的構(gòu)造函數(shù),一方面負責自己成員的初始化,另一方面還要負責調(diào)用基類的構(gòu)造函數(shù),向基類構(gòu)造函數(shù)傳送為初始化所必要的參數(shù)。

基類和派生類構(gòu)造函數(shù)執(zhí)行的順序是,系統(tǒng)首先調(diào)用基類的構(gòu)造函數(shù),然后,調(diào)用用派生類的構(gòu)造函數(shù)。系統(tǒng)執(zhí)行析構(gòu)函數(shù)的次序正好相反。

17.2.1不帶參數(shù)的基類構(gòu)造函數(shù)如果在基類中沒有定義構(gòu)造函數(shù),系統(tǒng)將調(diào)用基類的默認的構(gòu)造函數(shù)。

我們看到,在執(zhí)行派生類的構(gòu)造函數(shù)前,先要執(zhí)行基類的構(gòu)造函數(shù),然后,執(zhí)行派生類的構(gòu)造函數(shù)。析構(gòu)函數(shù)執(zhí)行的順序則相反。

17.2.2帶參數(shù)的基類構(gòu)造函數(shù)為把參數(shù)傳遞給基類,就要在派生類構(gòu)造函數(shù)后面,對這些參數(shù)加以說明。

派生類構(gòu)造函數(shù)定義的一般形式為:派生類名::派生類構(gòu)造函數(shù)名(參數(shù)表):基類構(gòu)造函數(shù)名(參數(shù)表){......}

這里要注意用冒號“:”把派生類構(gòu)造函數(shù)同基類構(gòu)造函數(shù)的參數(shù)表分隔開。其作用是將派生類構(gòu)造函數(shù)的參數(shù),傳遞給基類相應(yīng)的參數(shù)。這里,兩個構(gòu)造函數(shù)的參數(shù)存在著對應(yīng)的關(guān)系。

派生類構(gòu)造函數(shù)的參數(shù)表中含有參數(shù)的數(shù)據(jù)類型和參數(shù)名,并且必須包括基類構(gòu)造函數(shù)的參數(shù)。在基類構(gòu)造函數(shù)的參數(shù)表中則只有參數(shù)名,不要參數(shù)的數(shù)據(jù)類型。17.3多重繼承

17.3.1多重繼承的繼承機制所謂多重繼承就是一個類繼承多個基類的屬性。例如,類C以private方式繼承類A,同時又以public方式繼承類B,如圖17-2所示。

圖17-2簡單多重繼承示意圖

定義多重繼承的派生類的一般形式為:

class派生類名:繼承方式基類名1,繼承方式基類名2,…,繼承方式基類名n{……};

多重繼承下派生類的構(gòu)造函數(shù)必須同時負責所有基類構(gòu)造函數(shù)的調(diào)用,派生類構(gòu)造函數(shù)的參數(shù)個數(shù),必須同時滿足多個基類初始化的需要。

所以,在多重繼承的情況下,派生類構(gòu)造函數(shù)的定義格式有如下的形式:派生類名::派生類構(gòu)造函數(shù)名(參數(shù)表):基類1(參數(shù)表1),基類2(參數(shù)表2),…

在多重繼承下,當建立派生類對象時,系統(tǒng)首先執(zhí)行各個基類的構(gòu)造函數(shù),最后執(zhí)行派生類的構(gòu)造函數(shù)?;悩?gòu)造函數(shù)的執(zhí)行順序,與定義派生類時所指定的基類順序一致。析構(gòu)函數(shù)的調(diào)用則以相反的順序進行。

17.3.2指向派生類的指針指向基類的指針和指向派生類的指針之間有一定的關(guān)系。定義為派生類的指針則既可以訪問派生類中定義的成員,也可以訪問從基類繼承來的成員。17.4虛基類

17.4.1多重繼承中的二義性在C++中,如果在多條繼承路徑上有一個公共的基類,那么,在這些路徑中的某幾條路徑的匯合處,這個公共的基類會產(chǎn)生多個拷貝(實例)。這樣就出現(xiàn)了多義性問題。

例如,有一基類Base,它含有一數(shù)據(jù)成員b。類Base_der1和類Base_der2均是繼承類base的派生類。現(xiàn)在,類der12又繼承類base_der1和類base_der2。這個繼承結(jié)構(gòu)如圖17-3所示。

圖17-3多重繼承結(jié)構(gòu)的二義性

基類的數(shù)據(jù)成員b,在兩個派生類Base_der1和類Base_der2中各有一個b的副本。對于派生類der12來說,就不知道繼承哪個b副本了。于是發(fā)生了數(shù)據(jù)成員b的二義性的問題。

17.4.2虛基類為了使例17-8中的公共的基類只產(chǎn)生一個數(shù)據(jù)成員b的拷貝,可以將這個基類說明為虛基類。這樣就不會產(chǎn)生二義性的問題。

虛基類是在從基類派生出新類時,用關(guān)鍵字virtual將基類說明為虛基類的。

將一個基類說明為一個虛基類的一般形式為:class派生類名:virtual繼承方式基類名

在一般基類情況下,派生類的構(gòu)造函數(shù)要負責調(diào)用它的直接基類的構(gòu)造函數(shù),以便實現(xiàn)對基類數(shù)據(jù)成員的初始化。對于虛基類的派生類,其構(gòu)造函數(shù)不僅要負責調(diào)用直接基類的構(gòu)造函數(shù),還需要調(diào)用虛基類的構(gòu)造函數(shù)。小結(jié)

本章介紹了面向?qū)ο蟪绦蛟O(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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論