《面向?qū)ο蟪绦蛟O(shè)計(jì)》.ppt
《《面向?qū)ο蟪绦蛟O(shè)計(jì)》.ppt》由會(huì)員分享,可在線閱讀,更多相關(guān)《《面向?qū)ο蟪绦蛟O(shè)計(jì)》.ppt(36頁(yè)珍藏版)》請(qǐng)?jiān)谘b配圖網(wǎng)上搜索。
面向?qū)ο蟪绦蛟O(shè)計(jì)理論篇 武漢大學(xué) 資源與環(huán)境科學(xué)學(xué)院 地理信息科學(xué)系 教材及參考資料 面向?qū)ο蟮睦碚撆cC 實(shí)踐 王燕編著清華大學(xué)出版社 By 任福博士Email renfu Room 7 501 第十一章 繼承與類的派生 要設(shè)計(jì)可重用性模塊 任何方法都必須面對(duì)重復(fù)和差別 為了避免一再地重寫同樣的代碼 引入不一致的錯(cuò)誤 就必須進(jìn)行抽象 抽象出一般特性后 還需在此基礎(chǔ)上擴(kuò)充其特殊的功能 使之能表達(dá)具體的事物 繼承是軟件重用的一種形式 實(shí)現(xiàn)這種形式的方法是從現(xiàn)有類建立新類 新類繼承了現(xiàn)有類的屬性和行為 并且為了使新類具有自己所需要的功能 新類還要對(duì)這些屬性和行為予以修飾 青出于藍(lán)而勝于藍(lán) 11 派生類的概念 第十一章 繼承與類的派生 繼承是對(duì)象類之間的一種相交關(guān)系 是派生關(guān)系 具有以下性質(zhì) 1 類間的共享特性 2 類間的細(xì)微區(qū)別 3 類間的層次結(jié)構(gòu) 在建立一個(gè)新類時(shí) 程序員可以讓新類繼承預(yù)定義基類的數(shù)據(jù)成員和成員函數(shù) 這種新類稱為派生類 派生類本身也可能成為未來派生類的基類 對(duì)于單重繼承 派生類只有一個(gè)基類 對(duì)于多重繼承 派生類通常是從多個(gè)基類派生出來的 這些基類之間可能毫無(wú)關(guān)系 派生類通常添加了它自己的數(shù)據(jù)成員和成員函數(shù) 因而通常比基類大的多 派生類比基類更具體 它代表了一組外延較小的對(duì)象 對(duì)于單重繼承 派生類和基類有相同的起源 繼承的真正魅力在于能夠添加基類所沒有的特點(diǎn)及取代和改進(jìn)從基類繼承來的特點(diǎn) 11 為什么使用繼承 第十一章 繼承與類的派生 繼承的目的在于為代碼重用提供有效手段 可以重用先前項(xiàng)目的代碼 如果原來的代碼不滿足要求 還可以做少量修改 某個(gè)項(xiàng)目使用了幾個(gè)非常相似或稍有不同的類 就可以通過派生類的繼承性達(dá)到函數(shù)和數(shù)據(jù)繼承的目的 繼承最具有吸引力的特點(diǎn)是新類可以從現(xiàn)有的類庫(kù)中繼承 項(xiàng)目開發(fā)者可以開發(fā)出自己的類庫(kù) 基于這種觀點(diǎn) 將來有一天 軟件也可以象當(dāng)今的硬件一樣用標(biāo)準(zhǔn)的可重用組件進(jìn)行構(gòu)造 11 派生類的定義 第十一章 繼承與類的派生 派生類具有的特征 新的類可在基類所提供的基礎(chǔ)上包含新的成員 在新的類中可隱藏基類的任何函數(shù)成員 可為新的類重新定義函數(shù) 定義格式 Class 派生類名 繼承方式 基類名 派生類新定義成員 其中 繼承方式 常使用如下三種關(guān)鍵字給予表示 public表示公有基類private表示私有基類 可以省略protected表示保護(hù)基類 11 派生類對(duì)基類成員的訪問權(quán) 第十一章 繼承與類的派生 派生類并不是對(duì)基類中的所有成員都可以無(wú)條件的進(jìn)行訪問對(duì)于基類的私有成員 派生類及派生類的使用者都無(wú)權(quán)訪問 對(duì)于基類的公有成員的訪問權(quán) 在定義派生類時(shí) 定義的方式不同 權(quán)限也不同 11 派生類對(duì)基類成員的訪問權(quán) 第十一章 繼承與類的派生 私有派生 私有派生類對(duì)基類的公有成員只能是私有繼承 也即基類的所有公有成員都只能成為私有派生類的私有成員 這些私有成員只能被派生類的成員函數(shù)訪問 而派生類的使用者無(wú)權(quán)訪問 若希望基類中某些公有成員在派生類中也是公有的 使得派生類的使用者能夠使用它 則可以在派生類的公有段中說明這些成員 并在成員名前綴上 類名 有幾個(gè)成員需要成為派生類的公有成員 在派生類中分別給出類似的定義 舉例見教材P169 170 11 派生類對(duì)基類成員的訪問權(quán) 第十一章 繼承與類的派生 2 公有派生 公有派生的意義是基類中所有的公有成員在派生類中也都是公有的 這就省去了每個(gè)成員均要在派生類中聲明才能變?yōu)楣械墓ぷ?基類的公有成員保持原有的狀態(tài) 舉例見教材P170 11 派生類對(duì)基類成員的訪問權(quán) 第十一章 繼承與類的派生 示意圖 舉例見教材P171 172 173 classbase private public classderive1 base private public classderive2 publicderive1 private public 11 派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù) 第十一章 繼承與類的派生 1 派生類構(gòu)造函數(shù) 我們已知道 派生類的對(duì)象的數(shù)據(jù)結(jié)構(gòu)是由基類中說明的數(shù)據(jù)成員和派生類中說明的數(shù)據(jù)成員共同構(gòu)成 將派生類的對(duì)象中由基類中說明的數(shù)據(jù)成員和操作所構(gòu)成的封裝體稱為基類子對(duì)象 它由基類中的構(gòu)造函數(shù)進(jìn)行初始化 構(gòu)造函數(shù)不能夠被繼承 因此 派生類的構(gòu)造函數(shù)必須通過調(diào)用基類的構(gòu)造函數(shù)來初始化基類子對(duì)象 所以 在定義派生類的構(gòu)造函數(shù)時(shí)除了對(duì)自己的數(shù)據(jù)成員進(jìn)行初始化外 還必須負(fù)責(zé)調(diào)用基類構(gòu)造函數(shù)使基類數(shù)據(jù)成員得以初始化 如果派生類中還有子對(duì)象時(shí) 還應(yīng)包含對(duì)子對(duì)象初始化的構(gòu)造函數(shù) 11 派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù) 第十一章 繼承與類的派生 1 派生類構(gòu)造函數(shù) 派生類構(gòu)造函數(shù)的一般格式如下 參數(shù)表1 舉例見教材P176 11 派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù) 第十一章 繼承與類的派生 1 派生類構(gòu)造函數(shù) 在下面兩種情況下 必須定義派生類的構(gòu)造函數(shù) 派生類本身需要構(gòu)造函數(shù) 定義派生類對(duì)象時(shí) 其相應(yīng)的基類對(duì)象需調(diào)用帶有參數(shù)的構(gòu)造函數(shù) 可以不定義派生類構(gòu)造函數(shù)的情況 若基類使用缺省構(gòu)造函數(shù)或不帶參數(shù)的構(gòu)造函數(shù) 在派生類定義構(gòu)造函數(shù)時(shí) 可以省略基類 構(gòu)造函數(shù) 變?cè)?在此情況下 若派生類不需要初始化 則可以不定義派生類構(gòu)造函數(shù) 執(zhí)行順序是 先祖先 基類 再客人 對(duì)象成員 后自己 派生類 11 派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù) 第十一章 繼承與類的派生 派生類析構(gòu)函數(shù) 在派生類中是否要定義析構(gòu)函數(shù)與基類無(wú)關(guān) 各自獨(dú)立執(zhí)行 若基類 成員類 派生類均有析構(gòu)函數(shù) 在執(zhí)行時(shí)的順序剛好與構(gòu)造函數(shù)的順序相反 即 派生類 成員類 基類 執(zhí)行順序是 先自己 派生類 再客人 對(duì)象成員 后祖先 基類 11 派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù) 第十一章 繼承與類的派生 帶有構(gòu)造函數(shù)和析構(gòu)函數(shù)的類的派生類舉例 舉例 舉例 派生類與基類的構(gòu)造函數(shù)和析構(gòu)函數(shù)調(diào)用順序 舉例見教材P177 178 11 派生類對(duì)基類成員的繼承 第十一章 繼承與類的派生 焦點(diǎn) 如何來調(diào)整派生類的訪問權(quán)限 11 如何訪問基類私有成員 第十一章 繼承與類的派生 不管私有派生還是公有派生 派生類無(wú)權(quán)訪問基類私有成員 只有通過基類提供的公有函數(shù) 接口 進(jìn)行訪問 為達(dá)到直接訪問可以采用以下兩種方式 增加保護(hù)段聲明友元 11 如何訪問基類私有成員 第十一章 繼承與類的派生 在類定義體中增加保護(hù)段 關(guān)鍵字 protected將基類私有成員中需提供給派生類訪問的部分定義為保護(hù)段成員 保護(hù)段成員可以被它的派生類訪問 但是對(duì)于外界是隱藏起來的 即 就這個(gè)類的用戶而言 它是private的 但它可被從這個(gè)類繼承來的任何來使用 派生類對(duì)于保護(hù)段成員的繼承與公有段成員的繼承很相似 分以下兩種情況 公有派生 基類的保護(hù)成員在派生類中處于保護(hù)成員 私有派生 基類的保護(hù)成員在派生類中處于私有成員 舉例見教材P184 11 如何訪問基類私有成員 第十一章 繼承與類的派生 將需要訪問基類私有成員的派生類成員函數(shù)聲明為基類的友元 基類的保護(hù)段成員可以通過一定的處理 連續(xù)的公有派生 使其成為對(duì)外界開放的 將待訪問的派生類中的成員函數(shù)說明是基類的友元 這樣派生類中的其他成員函數(shù)都無(wú)權(quán)訪問它 外界不可能通過派生新類來達(dá)到訪問基類私有成員的目的 如果想讓派生類中的所有成員函數(shù)均有權(quán)訪問基類的私有成員 可以將整個(gè)派生類聲明為基類的友元 11 通過訪問聲明調(diào)整訪問域 第十一章 繼承與類的派生 訪問聲明用來改變到派生類中變?yōu)樗接械幕惞谐蓡T的訪問域 它遵循以下規(guī)則 1 訪問聲明僅僅調(diào)整名字的訪問 不可以為它說明任何類型 若名字為成員函數(shù) 在訪問聲明時(shí)也不準(zhǔn)說明任何參數(shù) 2 訪問聲明只能調(diào)整基類的保護(hù)段和公有段成員在派生類中的訪問域 不能改變基類的私有成員在派生中的訪問域 任何試圖這樣的操作都是非法的 3 訪問聲明僅用于在派生類中調(diào)整名字的訪問權(quán)限 不允許在派生類中降低或提升基類成員的可訪問性 4 對(duì)重載函數(shù)名的訪問聲明將調(diào)整基類中具有該名的所有函數(shù)的訪問域 處于不同段也不可以 5 若在派生類中具有與基類中同名的函數(shù) 則基類中的此函數(shù)不允許在派生類中進(jìn)行訪問聲明 舉例見教材P191 192 193 11 不同繼承方式的基類和派生類的特性 第十一章 繼承與類的派生 11 不同繼承方式的基類和派生類的特性 第十一章 繼承與類的派生 為了進(jìn)一步理解三種不同的繼承方式在其成員的可見性方面的區(qū)別 下面從三種不同角度進(jìn)行討論 對(duì)于公有繼承方式 1 基類成員對(duì)其對(duì)象的可見性 公有成員可見 其他不可見 這里保護(hù)成員同于私有成員 2 基類成員對(duì)派生類的可見性 公有成員和保護(hù)成員可見 而私有成員不可見 這里保護(hù)成員同于公有成員 3 基類成員對(duì)派生類對(duì)象的可見性 公有成員可見 其他成員不可見 所以 在公有繼承時(shí) 派生類的對(duì)象可以訪問基類中的公有成員 派生類的成員函數(shù)可以訪問基類中的公有成員和保護(hù)成員 這里 一定要區(qū)分清楚派生類的對(duì)象和派生類中的成員函數(shù)對(duì)基類的訪問是不同的 11 不同繼承方式的基類和派生類的特性 第十一章 繼承與類的派生 為了進(jìn)一步理解三種不同的繼承方式在其成員的可見性方面的區(qū)別 下面從三種不同角度進(jìn)行討論 對(duì)于私有繼承方式 1 基類成員對(duì)其對(duì)象的可見性 公有成員可見 其他成員不可見 2 基類成員對(duì)派生類的可見性 公有成員和保護(hù)成員是可見的 而私有成員是不可見的 3 基類成員對(duì)派生類對(duì)象的可見性 所有成員都是不可見的 所以 在私有繼承時(shí) 基類的成員只能由直接派生類訪問 而無(wú)法再往下繼承 11 不同繼承方式的基類和派生類的特性 第十一章 繼承與類的派生 為了進(jìn)一步理解三種不同的繼承方式在其成員的可見性方面的區(qū)別 下面從三種不同角度進(jìn)行討論 對(duì)于保護(hù)繼承方式 這種繼承方式與私有繼承方式的情況相同 兩者的區(qū)別僅在于對(duì)派生類的成員而言 對(duì)基類成員有不同的可見性 11 多繼承 第十一章 繼承與類的派生 在解決實(shí)際問題時(shí) 某個(gè)類也許具有多個(gè)類所具有的特點(diǎn) 因此 引入多繼承機(jī)制 11 多繼承的概念 第十一章 繼承與類的派生 多繼承可以看作是單繼承的擴(kuò)展 所謂多繼承是指派生類具有多個(gè)基類 派生類與每個(gè)基類之間的關(guān)系仍可看作是一個(gè)單繼承 11 多繼承的定義 第十一章 繼承與類的派生 多繼承下派生類的定義格式如下 class 其中 是三種繼承方式 public private protected之一 注意 在多重繼承中 公有派生和私有派生對(duì)于基類成員在派生類中的可訪問性與單繼承的規(guī)則相同 舉例見教材P195 11 多繼承的構(gòu)造函數(shù)和析構(gòu)函數(shù) 第十一章 繼承與類的派生 在多繼承的情況下 派生類的構(gòu)造函數(shù)格式如下 其中 中各個(gè)參數(shù)包含了其后的各個(gè)分參數(shù)表 注意 多繼承下派生類的構(gòu)造函數(shù)與單繼承下派生類構(gòu)造函數(shù)相似 它必須同時(shí)負(fù)責(zé)該派生類所有基類構(gòu)造函數(shù)的調(diào)用 同時(shí) 派生類的參數(shù)個(gè)數(shù)必須包含完成所有基類初始化所需的參數(shù)個(gè)數(shù) 構(gòu)造函數(shù)的定義 舉例見教材P197 11 多繼承的構(gòu)造函數(shù)和析構(gòu)函數(shù) 第十一章 繼承與類的派生 構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行順序 派生類構(gòu)造函數(shù)執(zhí)行順序是先執(zhí)行所有基類的構(gòu)造函數(shù) 再執(zhí)行派生類本身構(gòu)造函數(shù) 處于同一層次的各基類構(gòu)造函數(shù)的執(zhí)行順序取決于定義派生類時(shí)所指定的各基類順序 與派生類構(gòu)造函數(shù)中所定義的成員初始化列表的各項(xiàng)順序無(wú)關(guān) 也就是說 執(zhí)行基類構(gòu)造函數(shù)的順序取決于定義派生類時(shí)基類的順序 可見 派生類構(gòu)造函數(shù)的成員初始化列表中各項(xiàng)順序可以任意地排列 析構(gòu)函數(shù)的執(zhí)行順序正好相反 11 虛基類 第十一章 繼承與類的派生 為什么要使用虛基類 理由 合并基類的副本 虛基類 virtual其中 virtual是虛類的關(guān)鍵字 虛基類的說明是用在定義派生類時(shí) 寫在派生類名的后面 一個(gè)基類 在定義它的派生類時(shí) 在作為某些派生類的虛基類的同時(shí) 又作為另一些派生類的非虛基類 這種情況是允許的 例如 classx virtualpublicb classy virtualpublicb classz publicb classaa publicx publicy publicz 11 虛基類 第十一章 繼承與類的派生 虛基類的概念 11 虛基類 第十一章 繼承與類的派生 虛基類的初始化 虛基類的初始化與一般的多繼承的初始化在語(yǔ)法上是一樣的 但構(gòu)造函數(shù)的調(diào)用次序不同 原則如下 虛基類的構(gòu)造函數(shù)在非虛基類之前調(diào)用 若同一層次中包含多個(gè)虛基類 這些基類的構(gòu)造函數(shù)按它們說明的次序調(diào)用 若虛基類由非虛基類派生而來 則仍然先調(diào)用基類構(gòu)造函數(shù) 再調(diào)用派生類的構(gòu)造函數(shù) 虛基類只允許定義不帶參數(shù)的或帶缺省參數(shù)的構(gòu)造函數(shù) 舉例見教材P207 11 基類與派生類的關(guān)系 第十一章 繼承與類的派生 任何一個(gè)類都可以派生出一個(gè)新類 派生類也可以再派生出新類 因此 基類和派生類是相對(duì)而言的 基類與派生類之間的關(guān)系可以有如下幾種描述 1 派生類是基類的具體化類的層次通常反映了客觀世界中某種真實(shí)的模型 在這種情況下 不難看出 基類是對(duì)若干個(gè)派生類的抽象 而派生類是基類的具體化 基類抽取了它的派生類的公共特征 而派生類通過增加行為將抽象類變?yōu)槟撤N有用的類型 2 派生類是基類定義的延續(xù)先定義一個(gè)抽象基類 該基類中有些操作并未實(shí)現(xiàn) 然后定義非抽象的派生類 實(shí)現(xiàn)抽象基類中定義的操作 例如 虛函數(shù)就屬此類情況 這時(shí) 派生類是抽象的基類的實(shí)現(xiàn) 即可看成是基類定義的延續(xù) 這也是派生類的一種常用方法 11 基類與派生類的關(guān)系 第十一章 繼承與類的派生 任何一個(gè)類都可以派生出一個(gè)新類 派生類也可以再派生出新類 因此 基類和派生類是相對(duì)而言的 基類與派生類之間的關(guān)系可以有如下幾種描述 3 派生類是基類的組合在多繼承時(shí) 一個(gè)派生類有多于一個(gè)的基類 這時(shí)派生類將是所有基類行為的組合 派生類將其本身與基類區(qū)別開來的方法是添加數(shù)據(jù)成員和成員函數(shù) 因此 繼承的機(jī)制將使得在創(chuàng)建新類時(shí) 只需說明新類與已有類的區(qū)別 從而大量原有的程序代碼都可以復(fù)用 所以有人稱類是 可復(fù)用的軟件構(gòu)件 11 繼承使用的注意事項(xiàng) 第十一章 繼承與類的派生 對(duì)于 程序而言 設(shè)計(jì)孤立的類是比較容易的 難的是正確設(shè)計(jì)基類及派生類 避免 不吃白不吃 如果 類和 類毫不相關(guān) 不可以為了使 的功能更多而讓 繼承 的功能和屬性 如果在邏輯上 是 的 一種 并且 的所有功能和屬性對(duì) 都有意義 則允許 繼承 的功能和屬性 避免 母雞下鴨蛋 若在邏輯上 是 的一部分 則不允許 從 派生 而是要用 和其他東西組合 整體 部分 關(guān)系 成 例如頭與眼 鼻 耳 口等的關(guān)系 總結(jié) 第十一章 繼承與類的派生 繼承的幾種方式及特點(diǎn)類繼承的構(gòu)造和析構(gòu)函數(shù)虛基類的涵義繼承的應(yīng)用 11 派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù) 第十一章 繼承與類的派生 classB publicA public B b 0 cout 類B的缺省構(gòu)造函數(shù) n B inti intj intk B cout 類B的析構(gòu)函數(shù) n voidPrint private intb Aaa includeclassA public A a 0 cout 類A的缺省構(gòu)造函數(shù) n A inti a i cout 類A的構(gòu)造函數(shù) n A cout 類A的析構(gòu)函數(shù) n voidPrint const cout A intGeta reutrna private inta B B inti intj intk A i aa j b k cout 類B的構(gòu)造函數(shù) n voidB Print A Print cout B AA GETA ENDL voidmain Bbb 2 bb 0 B 1 2 5 bb 1 B 3 4 7 for inti 0 i 2 i bb i Print 返回- 1.請(qǐng)仔細(xì)閱讀文檔,確保文檔完整性,對(duì)于不預(yù)覽、不比對(duì)內(nèi)容而直接下載帶來的問題本站不予受理。
- 2.下載的文檔,不會(huì)出現(xiàn)我們的網(wǎng)址水印。
- 3、該文檔所得收入(下載+內(nèi)容+預(yù)覽)歸上傳者、原創(chuàng)作者;如果您是本文檔原作者,請(qǐng)點(diǎn)此認(rèn)領(lǐng)!既往收益都?xì)w您。
下載文檔到電腦,查找使用更方便
9.9 積分
下載 |
- 配套講稿:
如PPT文件的首頁(yè)顯示word圖標(biāo),表示該P(yáng)PT已包含配套word講稿。雙擊word圖標(biāo)可打開word文檔。
- 特殊限制:
部分文檔作品中含有的國(guó)旗、國(guó)徽等圖片,僅作為作品整體效果示例展示,禁止商用。設(shè)計(jì)者僅對(duì)作品中獨(dú)創(chuàng)性部分享有著作權(quán)。
- 關(guān) 鍵 詞:
- 面向?qū)ο蟪绦蛟O(shè)計(jì) 面向 對(duì)象 程序設(shè)計(jì)
鏈接地址:http://www.hcyjhs8.com/p-8695644.html