黄色在线观看视频-黄色在线免费看-黄色在线视频免费-黄色在线视频免费看-免费啪啪网-免费啪啪网站

首頁考試吧論壇Exam8視線考試商城網絡課程模擬考試考友錄實用文檔求職招聘論文下載
2013中考
法律碩士
2013高考
MBA考試
2013考研
MPA考試
在職研
中科院
考研培訓 自學考試 成人高考
四 六 級
GRE考試
攻碩英語
零起點日語
職稱英語
口譯筆譯
申碩英語
零起點韓語
商務英語
日語等級
GMAT考試
公共英語
職稱日語
新概念英語
專四專八
博思考試
零起點英語
托福考試
托業考試
零起點法語
雅思考試
成人英語三級
零起點德語
等級考試
華為認證
水平考試
Java認證
職稱計算機 微軟認證 思科認證 Oracle認證 Linux認證
公 務 員
導游考試
物 流 師
出版資格
單 證 員
報 關 員
外 銷 員
價格鑒證
網絡編輯
駕 駛 員
報檢員
法律顧問
管理咨詢
企業培訓
社會工作者
銀行從業
教師資格
營養師
保險從業
普 通 話
證券從業
跟 單 員
秘書資格
電子商務
期貨考試
國際商務
心理咨詢
營 銷 師
司法考試
國際貨運代理人
人力資源管理師
廣告師職業水平
衛生資格 執業醫師 執業藥師 執業護士
會計從業資格
基金從業資格
統計從業資格
經濟師
精算師
統計師
會計職稱
法律顧問
ACCA考試
注冊會計師
資產評估師
審計師考試
高級會計師
注冊稅務師
國際內審師
理財規劃師
美國注冊會計師
一級建造師
安全工程師
設備監理師
公路監理師
公路造價師
二級建造師
招標師考試
物業管理師
電氣工程師
建筑師考試
造價工程師
注冊測繪師
質量工程師
巖土工程師
造價員考試
注冊計量師
環保工程師
化工工程師
咨詢工程師
結構工程師
城市規劃師
材料員考試
監理工程師
房地產估價
土地估價師
安全評價師
房地產經紀人
投資項目管理師
環境影響評價師
土地登記代理人
繽紛校園 實用文檔 英語學習 作文大全 求職招聘 論文下載 訪談|游戲
計算機等級考試
您現在的位置: 考試吧(Exam8.com) > 計算機等級考試 > 計算機二級 > C加加 > 復習資料 > 正文

2013年計算機等考二級C++考點歸納:繼承與派生

來源:考試吧Exam8.com) 2013-1-23 11:08:39 考試吧:中國教育培訓第一門戶 模擬考場

  第7章 繼承與派生

  7.1 繼承與派生

  1、基本概念

  派生類從基類繼承了各種成員的關系就稱為繼承。

  類的繼承是新的類從已有類那里得到已有的特性。從已有的類產生新類的過程就是類的派生。在繼承過程中,原有的類或已經存在的用來派生新類的類稱為基類或父類,而由已經存在的類派生出的新類則稱為派生類或子類。

  從派生類的角度,根據它所擁有的基類數目不同,可以分為單繼承和多繼承。一個類只有一個直接基類時,稱為單繼承;而一個類同時有多個直接基類時,則稱為多繼承。

  從上面的描述可知,任何一個類都可以派生出一個新類,派生類也可以再派生出新類,因此,基類和派生類是相對而言的,一個基類可以是另一個基類的派生類,從而形成了復雜的繼承結構,出現了類的層次。基類與派生類之間的關系如下:

  (1)基類是對派生類的抽象,派生類是對基類的具體化。基類抽取了它的派生類的公共特征,而派生類通過增加信息將抽象的基類變為某種有用的類型,派生類是基類定義的延續。

  (2)派生類是基類的組合。多繼承可以看作是多個單繼承的簡單組合。

  (3)公有派生類的對象可以作為基類的對象處理。這一點與類聚集(成員對象)是不同的,在類聚集(成員對象)中,一個類的對象只能擁有作為其成員的其他類的對象,但不能作為其他類對象而使用。

  2、派生類的定義與構成

  定義派生類的一般格式如下:

  class<派生類名>:<繼承方式1><基類名1>,

  <繼承方式2><基類名2>,

  ……,

  <繼承方式n><基類名n>

  {

  <派生類新定義成員>

  };

  其中,<基類名>是已有的類的名稱,<派生類名>是繼承原有類的特性而生成的新類的名稱。單繼承時,只需定義一個基類;多繼承時,需同時定義多個基類。

  <繼承方式>即派生類的訪問控制方式,用于控制基類中聲明的成員在多大的范圍內能被派生類的用戶訪問。每一個繼承方式,只對緊隨其后的基類進行限定。繼承方式包括3種:公有繼承(public)、私有繼承(private)和保護繼承(protected)。如果不顯式地給出繼承方式,缺省的類繼承方式是私有繼承private.

  7.2 派生類的構造函數和析構函數

  1、派生類構造函數的一般格式如下:

  <派生類名>::<派生類名>(<總參數表>):<基類名1>(參數表1),

  ……

  <基類名n>(<參數表n>),

  <成員對象名1>(<參數表n+1>),

  ……,

  <成員對象名m>(<參數表n+m>)

  {

  <派生類構造函數體>

  }

  派生類的構造函數名與類名相同。在構造函數的參數表中,給出了初始化基類數據、成員對象數據以及新增的其他數據成員所需要的全部參數。在參數表之后,列出需要使用參數進行初始化的基類名和成員對象名以及各自的參數名,各項之間使用逗號分隔。注意對基類成員和新增成員對象的初始化必須在成員初始化列表中進行。

  當派生類有多個基類時,處于同一層次的各個基類的構造函數的調用順序取決于定義派生類時聲明的順序(自左向右),而與在派生類構造函數的成員初始化列表中給出的順序無關。如果派生類的基類也是一個派生類,則每個派生類只需負責它的直接基類的構造,依次上溯。

  當派生類中有多個成員對象時,各個成員對象構造函數的調用順序也取決于在派生類中定義的順序(自上而下),而與在派生類構造函數的成員初始化列表中給出的順序無關。

  建立派生類對象時,構造函數的執行順序如下:

  (1)執行基類的構造函數,調用順序按照各個基類被繼承時聲明的順序(自左向右);

  (2)執行成員對象的構造函數,調用順序按照各個成員對象在類中聲明的順序(自上而下);

  (3)執行派生類的構造函數。

  派生類的構造函數只有在需要的時候才必須定義。派生類構造函數提供了將參數傳遞給基類構造函數的途徑,以保證在基類進行初始化時能夠獲得必要的數據。因此,如果基類的構造函數定義了一個或多個參數時,派生類必須定義構造函數。

  如果基類中定義了缺省構造函數或根本沒有定義任何一個構造函數(此時,由編譯器自動生成缺省構造函數)時,在派生類構造函數的定義中可以省略對基類構造函數的調用,即省略“<基類名>(<參數表>)”.成員對象的情況與基類相同。

  當所有的基類和成員對象的構造函數都可以省略,并且也可以不在成員初始化列表中對其他數據成員進行初始化時,可以省略派生類構造函數的成員初始化列表。

  2、派生類的析構函數

  與構造函數相同,派生類的析構函數在執行過程中也要對基類和成員對象進行操作,但它的執行過程與構造函數嚴格相反,即:

  (1)對派生類新增普通成員進行清理。

  (2)調用成員對象析構函數,對派生類新增的成員對象進行清理。

  (3)調用基類析構函數,對基類進行清理。

  派生類析構函數的定義與基類無關,與沒有繼承關系的類中的析構函數的定義完全相同。它只負責對新增普通成員的清理工作,系統會自己調用基類及成員對象的析構函數進行相應的清理工作。

  7.3 多繼承與虛基類

  1、多繼承中的二義性問題

  在派生類中對基類成員的訪問應該是唯一的。但是,在多繼承情況下,可能造成對基類中某個成員的訪問出現了不唯一的情況,這時就稱對基類成員的訪問產生了二義性。

  要解決這一問題,有兩種方法:

  (1)通過作用域運算符(::)明確指出訪問的是基類Basel的fun()函數,還是基類Base2的fun()函數。

  使用作用域運算符進行限定的一般格式是:

  <對象名>.<基類名>::<成員名>

  //數據成員

  <對象名>.<基類名>::<成員名>(參數表>)

  //成員函數

  (2)在類中定義同名成員

  對于在不同的作用域中聲明的標識符的可見性原則是:如果存在兩個或多個具有包含關系的作用域,外層聲明的標識符如果在內層沒有聲明同名標識符,那么它在內層可見;如果內層聲明了同名標識符,則外層標識符在內層不可見,這時稱內層變量覆蓋了外層同名變量。

  在類的繼承層次結構中,基類的成員和派生類新增的成員都具有類作用域,二者的作用范圍不同,是相互包含的兩個層,派生類在內層。這時,如果派生類定義了一個和某個基類成員同名的新成員(如果是成員函數,則參數表也要相同,參數不同的情況屬于重載),派生的新成員就覆蓋了外層同名成員,直接使用成員名只能訪問到派生類的成員。

  2、虛基類的定義

  當一個派生類從多個基類派生,而這些基類又有一個共同的基類,當對該基類中說明的成員進行訪問時,可能出現二義性。虛基類就是為了解決這種二義性問題提出來的。

  在產生二義性問題的第二種情況中,產生二義性的最主要的原因是基類Base在派生類Derived2中產生了兩個基類子對象,從而導致了對基類Base的成員data訪問的不唯一性。要解決這個問題,只需使這個公共基類Base在派生類中只產生一個子對象即可。虛基類就可以完成這個任務。

  虛基類的說明格式如下:

  class<類名>:virtual<繼承方式><基類名>

  其中,關鍵字virtual與繼承方式的位置無關,但必須位于虛基類名之前,且virtual只對緊隨其后的基類名起作用。

  3、虛基類的構造函數

  使用虛基類解決二義性問題的關鍵是在派生類中只產生一個虛基類子對象。為初始化基類子對象,派生類的構造函數要調用基類的構造函數。對于虛基類,由于派生類的對象中只有一個虛基類子對象,所以,在建立派生類的一個對象時,為保證虛基類子對象只被初始化一次,這個虛基類構造函數必須只被調用一次。雖然繼承結構的層次可能很深,但要建立的對象所屬的類只是這個繼承結構中間的某個類,因此將在建立對象時所指定的類稱為最派生類。虛基類子對象由最派生類的構造函數通過調用虛基類的構造函數進行初始化。所以,最派生類的構造函數的成員初始化列表中必須列出對虛基類構造函數的調用;如果未列出,則表示使用該虛基類的缺省構造函數。

  由于最派生類總是相對的,因此,從虛基類直接或間接派生的派生類中的構造函數的成員初始化列表中都要列出對虛基類構造函數的調用。但只有用于建立對象的最派生類的構造函數才調用虛基類的構造函數,此時最派生類的所有基類中列出的對虛基類的構造函數的調用在執行過程中都被忽略,從而保證對虛基類子對象只初始化一次。

  當在一個成員初始化列表中同時出現對虛基類和非虛基類構造函數的調用時,虛基類的構造函數先于非虛基類的構造函數執行。

  7.4 子類型關系

  公有繼承時,派生類的對象可以作為基類的對象處理,派生類是基類的子類型。

  子類型關系使得在需要基類對象的任何地方都可以使用公有派生類的對象來替代,從而可以使用相同的函數統一處理基類對象和公有派生類對象(形參為基類對象時,實參可以是派生類對象),而不必為每一個類設計單獨的處理程序,大大提高了程序的效率。它是實現多態性的重要基礎之一。

  子類型關系的定義如下:

  有一個特定的類型S,當且僅當它提供了類型T的行為時,稱類型S是類型T的子類型。

  公有派生類的對象可以賦值給基類的對象。實際上不僅如此,具有子類型關系的基類和派生類的對象之間滿足如下賦值兼容規則:

  (1)公有派生類的對象可以賦值給基類的對象,即用公有派生類對象中從基類繼承來的成員,逐個賦值給基類對象的成員。

  (2)公有派生類的對象可以初始化基類的引用。

  (3)公有派生類的對象的地址可以賦值給指向基類的指針。

  7.5 虛函數與多態性

  1、多態性的概念

  一個面向對象的系統常常要求一組具有相同基本語義的方法能在同一接口下為不同的對象服務,這就是所謂多態性(polymorphism)。

  在C+ +語言中,多態性可分為兩類:編譯時的多態性和運行時的多態性。

  編譯時的多態性是通過函數重載和模板體現的。利用函數重載機制,在調用同名的函數時,編譯系統可根據實參的具體情況確定所調用的是同名函數中的哪一個。利用函數模板,編譯系統可根據模板實參以及模板函數實參的具體情況確定所要調用的是哪個函數,并生成相應的函數實例;利用類模板,編譯系統可根據模板實參的具體情況確定所要定義的是哪個類的對象,并生成相應的類實例。由于有關操作所針對的具體目標(函數或類)的確定都是在編譯時完成的,與運行時的動態環境無關,“編譯時的多態性”因此而得名,其實現機制則和為靜態綁定(static binding,也譯作靜態聯編)。函數重載是“函數”一章中已經學習過的內容,但其中沒有包含函數重載的一種特殊情況:運算符重載。

  2、虛函數

  在成員函數聲明的前面加上virtual修飾,即把該函數聲明為虛函數。虛函數可以是另一個類的友元函數,但不得是靜態成員函數。

  在派生類中可以重新定義從基類繼承下來的虛函數,從而提供該函數的適用于派生類的專門版本。也可能并不需要重新定義,在這種情況下,繼承下來的虛函數仍然保持其在基類中的定義,即派生類和基類使用同一函數版本。除少數特殊情況外,在派生類中重定義虛函數時,函數名、形參表和返回值類型必須保持不變。

  虛函數在派生類被重定義后,重定義的函數仍然是一個虛函數,可以在其派生類中再次被重定義。注意,對于虛函數的重定義函數,無論是否用virtual修飾都是虛函數。當然,最好不要省略virtual修飾,以免削弱程序的可讀性。

  對虛函數的調用有兩種方式:非多態調用和多態調用。非多態調用是指不借助于指針或引用的直接調用。非多態調用總是通過成員訪問運算符 .進行的。與通常的成員函數調用類似,非多態調用是建立在靜態綁定機制的基礎之上的,不具備多態性特征。多態調用是指借助于指向基類的指針或引用的調用。在C+ +中,一個基類指針(或引用)可以用于指向它的派生類對象,而且通過這樣的指針(或引用)調用虛函數時,被調用的是該指針(或引用)實際所指向的對象類的那個重定義版本。

  基類中的實函數也可以在派生類中重定義,但重定義的函數仍然是實函數。在實函數的情況下,通過基類指針(或引用)所調用的只能是基類的那個函數版本,無法調用到派生類中的重定義函數。也就是說,盡管調用的語法形式可能是相同的,但對實函數的任何形式的調用都是非多態的。注意,無論是虛函數還是實函數,在派生類中被重定義后,原來的函數版本即被隱藏,在通過成員訪問運算符 .直接調用該函數時,所調用的是重定義版本。但原來的版本依然存在,仍然可以通過在函數名前加域修飾(即:<類名>::)來調用它們。

  3、虛析構函數

  析構函數也可以通過virtual修飾而聲明為虛函數。虛析構函數與一般虛函數的不同之處在于:

  (1)重定義函數就是派生類的析構函數,不要求同名。

  (2)一個虛析構函數的版本被調用執行后,接著就要調用執行基類版本,依次類推,直到調用執行了派生序列的最開始的那個虛析構函數版本為止。

  通常,只要派生類中包含有虛函數的重定義(從而有可能被多態調用),而且對析函數進行了專門的聲明(而不是不做任何聲明,從而采用默認的析構函數),其基類的析構函數就應當聲明為虛函數,否則就可能出問題。

  4、純虛函數與抽象類

  在某些情況下,基類無法確定(或無法完全確定)一個虛函數的具體操作方式或內容,只能靠派生類來提供各個具體的實現版本。基類中的這種必須靠派生類提供重定義版本的虛函數稱為純虛函數。為了將一個虛函數聲明為純虛函數,需要在虛函數原形的語句結束符 ;之前加上=0.

  擁有純虛函數的類稱為抽象類,抽象類不能用來定義對象。如果一抽象類的派生類沒有重定義來自基類的某個純虛函數,則該函數在派生類中仍然是純虛函數,這就使得該派生類也成為抽象類。也就是說,一個派生類可以把重定義純虛函數的任務進一步轉交給它自己的派生類。

  可以在將一個函數聲明為純虛函數的同時,為該函數提供實現版本。換句話說,一個函數是否為純虛函數,取決于其原形的尾部是否為“=0”,與實現版本的有無沒有什么關系。擁有實現版本的純虛函數仍然有賴于派生類提供重定義版本。純虛函數的實現版本通常是不完善的版本,但包含了一些共有操作,供各個派生類在重定義函數中調用。派生類在重定義一個純虛函數時,可以繼續將之聲明為純虛函數。另外,純虛函數不得聲明為內聯函數。

1 2  下一頁
文章搜索
版權聲明:如果計算機等級考試網所轉載內容不慎侵犯了您的權益,請與我們聯系800@exam8.com,我們將會及時處理。如轉載本計算機等級考試網內容,請注明出處。
主站蜘蛛池模板: 亚洲国产剧情在线 | 欧美日韩在线观看免费 | 成人精品一区二区三区中文字幕 | 免费黄色毛片视频 | 99爱在线视频这里只有精品 | 色综合小说天天综合网 | 国内精品在线播放 | 国产伦精品一区二区三区免费 | 国产精品午夜在线观看 | 亚洲另类网 | 99riav国产在线观看 | 成人欧美一区二区三区黑人 | 欧美变态口味重另类牲 | 曰批免费视频播放在线看片一 | 99视频网址 | 亚洲一区二区三区在线免费观看 | 日韩免费看 | 久草中文视频 | 日韩香蕉视频 | 亚洲一区欧美日韩 | 国产亚洲欧美在线 | 乱系列h全文阅读小黄文肉 乱色美www女麻豆 | 亚洲免费观看视频 | 一级毛片观看 | 欧美性猛交xxxxbbbb | 天天操夜夜添 | 激性欧美在线播激性欧美 | 久久精品人人做人人爽97 | 久久精品国产日本波多麻结衣 | 亚欧乱色一区二区三区 | mm在线精品视频 | 最近中文字幕无免费视频 | 18在线观看国内精品视频 | 欧美色图第二页 | 中文字幕美日韩在线高清 | 粉嫩极品国产在线播放 | 国产一级一级毛片 | 天天操天天舔天天干 | 日韩欧美亚洲中字幕在线播放 | 波多野结衣福利 | 国产日韩精品一区二区 |