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