国产乱人视频免费观看网站,九九精品视频在线观看,九九久re8在线精品视频,日韩久久精品五月综合

<menu id="zjelp"></menu>

    <th id="zjelp"><tbody id="zjelp"><form id="zjelp"></form></tbody></th>
    <small id="zjelp"><menuitem id="zjelp"></menuitem></small>
  • <small id="zjelp"></small>

    <address id="zjelp"></address>
    <address id="zjelp"></address>
    C++程序設(shè)計(jì)-北京林業(yè)大學(xué)7%-第07章 繼承和派生

    C++程序設(shè)計(jì)-北京林業(yè)大學(xué)7%-第07章 繼承和派生

    ID:65574110

    大?。?11.00 KB

    頁數(shù):73頁

    時(shí)間:2024-08-29

    上傳者:U-3769
    C++程序設(shè)計(jì)-北京林業(yè)大學(xué)7%-第07章 繼承和派生_第1頁
    C++程序設(shè)計(jì)-北京林業(yè)大學(xué)7%-第07章 繼承和派生_第2頁
    C++程序設(shè)計(jì)-北京林業(yè)大學(xué)7%-第07章 繼承和派生_第3頁
    C++程序設(shè)計(jì)-北京林業(yè)大學(xué)7%-第07章 繼承和派生_第4頁
    C++程序設(shè)計(jì)-北京林業(yè)大學(xué)7%-第07章 繼承和派生_第5頁
    C++程序設(shè)計(jì)-北京林業(yè)大學(xué)7%-第07章 繼承和派生_第6頁
    C++程序設(shè)計(jì)-北京林業(yè)大學(xué)7%-第07章 繼承和派生_第7頁
    C++程序設(shè)計(jì)-北京林業(yè)大學(xué)7%-第07章 繼承和派生_第8頁
    C++程序設(shè)計(jì)-北京林業(yè)大學(xué)7%-第07章 繼承和派生_第9頁
    C++程序設(shè)計(jì)-北京林業(yè)大學(xué)7%-第07章 繼承和派生_第10頁
    資源描述:

    《C++程序設(shè)計(jì)-北京林業(yè)大學(xué)7%-第07章 繼承和派生》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。

    第七章繼承和派生 本章主要內(nèi)容(1)理解繼承的概念和意義。(2)理解單一繼承、多重繼承中基類與派生類之間的關(guān)系。(3)理解并掌握派生類構(gòu)造函數(shù)的編寫要求以及派生類對(duì)象的構(gòu)造過程和機(jī)理。(4)掌握虛函數(shù)和多態(tài)性的概念。(5)掌握虛函數(shù)的定義方法、調(diào)用方法及其在實(shí)現(xiàn)多態(tài)性方面所起到的作用。(6)了解純虛函數(shù)與抽象基類的概念。2北京林業(yè)大學(xué)軟件教研室 7.1繼承和派生的概念繼承(Inheritance)就是在一個(gè)已存在的類的基礎(chǔ)上建立一個(gè)新類,實(shí)質(zhì)就是利用已有的數(shù)據(jù)類型定義出新的數(shù)據(jù)類型。在繼承關(guān)系中:被繼承的類稱為基類(Baseclass)(或父類)定義出來的新類稱為派生類(Derivedclass)(子類)3北京林業(yè)大學(xué)軟件教研室 派生類不僅可以繼承原來類的成員,還可以通過以下方式擴(kuò)充新的成員:(1)增加新的數(shù)據(jù)成員(2)增加新的成員函數(shù)(3)重新定義已有成員函數(shù)(4)改變現(xiàn)有成員的屬性4北京林業(yè)大學(xué)軟件教研室 多層次繼承:在派生過程中,派生出來的新類同樣可以作為基類再繼續(xù)派生出更新的類,依此類推形成一個(gè)層次結(jié)構(gòu)。直接參與派生出某類稱為直接基類;而基類的基類,以及更深層的基類稱為間接基類。在類的層次結(jié)構(gòu)中,處于高層的類表示最一般的特征,而處于底層的類則表示更具體的特征。類族:同時(shí)一個(gè)基類可以直接派生出多個(gè)派生類。這樣形成了一個(gè)相互關(guān)聯(lián)的類族。如,MFC就是這樣的類族,它由一個(gè)CObject類派生出200個(gè)MFC類中的絕大多數(shù)。5北京林業(yè)大學(xué)軟件教研室 基類1基類2……基類n派生類1派生類2多重繼承單繼承:派生類只有一個(gè)直接基類。多重繼承:派生類同時(shí)有多個(gè)直接基類?;惻缮?派生類2單繼承6北京林業(yè)大學(xué)軟件教研室 7.2單繼承7.2.1單繼承的定義方式class派生類名:訪問方式基類名{派生類中的新成員}7北京林業(yè)大學(xué)軟件教研室 【例7-1】類Build_1是一個(gè)關(guān)于樓房數(shù)據(jù)的類。它的數(shù)據(jù)成員有posi_x、posi_y和area,分別表示樓房位置的經(jīng)、緯度和建筑面積。它的成員函數(shù)只有set1,用于設(shè)置數(shù)據(jù)成員posi_x、posi_y和area的值。讓Build_1作為基類,再增加數(shù)據(jù)成員height、成員函數(shù)set2和show來定義派生類Build_2。8北京林業(yè)大學(xué)軟件教研室 7.2.2派生類的成員構(gòu)成派生新類經(jīng)歷了三個(gè)步驟:(1)吸收基類成員派生類繼承和吸收了基類的全部數(shù)據(jù)成員和除了構(gòu)造函數(shù)、析構(gòu)函數(shù)之外的全部成員函數(shù)。(2)改造基類成員一是基類成員的訪問方式問題;二是對(duì)基類數(shù)據(jù)成員或成員函數(shù)的覆蓋。(3)添加新成員保證了派生類在功能上比基類有所發(fā)展。9北京林業(yè)大學(xué)軟件教研室 7.2.3繼承方式對(duì)基類成員的訪問屬性控制1.公有繼承(public繼承方式)基類中public和protected成員的訪問屬性在派生類中不變;而基類中的不可訪問成員和private成員在派生類中不可訪問。注意:不可訪問成員與私有成員的區(qū)別。10北京林業(yè)大學(xué)軟件教研室 2.私有繼承(private繼承方式)基類中public和protected成員都以private成員出現(xiàn)在派生類中;而基類中的不可訪問成員和private成員在派生類中不可訪問。相當(dāng)于中止了基類功能的繼續(xù)派生!11北京林業(yè)大學(xué)軟件教研室 3.保護(hù)繼承(protected繼承方式)基類中public和protected成員都以protected成員出現(xiàn)在派生類中;而基類中的不可訪問成員和private成員在派生類中不可訪問。12北京林業(yè)大學(xué)軟件教研室 類的繼承方式對(duì)基類成員的訪問屬性控制基類成員作為派生類成員公有繼承保護(hù)繼承私有繼承public成員public成員protected成員private成員protected成員protected成員protected成員private成員private成員不可訪問不可訪問不可訪問不可訪問成員不可訪問不可訪問不可訪問13北京林業(yè)大學(xué)軟件教研室 【例7-2】驗(yàn)證公有繼承方式下,類成員的訪問特性。14北京林業(yè)大學(xué)軟件教研室 【例7-3】驗(yàn)證私有繼承方式下,類成員的訪問特性。15北京林業(yè)大學(xué)軟件教研室 【例7-4】驗(yàn)證保護(hù)繼承方式下,類成員的訪問特性。16北京林業(yè)大學(xué)軟件教研室 7.2.4派生類的構(gòu)造函數(shù)派生類的構(gòu)造函數(shù):一方面負(fù)責(zé)調(diào)用基類的構(gòu)造函數(shù)對(duì)基類成員進(jìn)行初始化;另一方面還要負(fù)責(zé)對(duì)基類的構(gòu)造函數(shù)所需要的參數(shù)進(jìn)行必要的設(shè)置。派生類名::派生類構(gòu)造函數(shù)名(總參數(shù)列表):基類構(gòu)造函數(shù)名(參數(shù)列表){派生類中新增數(shù)據(jù)成員初始化語句}17北京林業(yè)大學(xué)軟件教研室 在定義派生類的對(duì)象時(shí):系統(tǒng)首先執(zhí)行基類的構(gòu)造函數(shù);然后執(zhí)行派生類的構(gòu)造函數(shù)?!纠?-5】定義一個(gè)點(diǎn)類Point,并由此派生出一個(gè)圓類Circle,并測(cè)試派生類的構(gòu)造函數(shù)和基類的構(gòu)造函數(shù)的執(zhí)行順序。18北京林業(yè)大學(xué)軟件教研室 派生類對(duì)基類成員重新定義:通過派生類的對(duì)象調(diào)用一個(gè)被重新定義過的基類的成員函數(shù),被調(diào)用的是派生類的成員函數(shù);此時(shí),若想調(diào)用基類的同名成員函數(shù),必須在成員函數(shù)名前加基類名和作用域運(yùn)算符“::”?!纠?-6】本例中分別定義一個(gè)描述圓的類Ccircle和一個(gè)描述圓柱體的類Ccylinder。19北京林業(yè)大學(xué)軟件教研室 在C++中,處理同名函數(shù)時(shí)有以下3種基本方法:①根據(jù)函數(shù)參數(shù)的特征進(jìn)行區(qū)分,即編譯器根據(jù)參數(shù)的類型或個(gè)數(shù)進(jìn)行區(qū)分。如:max(int,int)max(float,float)②根據(jù)類對(duì)象進(jìn)行區(qū)分。如:在上例中的main函數(shù)中,cylinder.area()circle.area()③使用作用域運(yùn)算符“::”進(jìn)行區(qū)分,如:Ccircle::area()以上3種方法都是在程序編譯過程中完成的,因此稱為靜態(tài)聯(lián)編。20北京林業(yè)大學(xué)軟件教研室 7.2.5有子對(duì)象的派生類的構(gòu)造函數(shù)派生類名::派生類構(gòu)造函數(shù)名(總參數(shù)列表):基類構(gòu)造函數(shù)名(參數(shù)列表),子對(duì)象名(參數(shù)列表),……{派生類中新增數(shù)據(jù)成員初始化語句}此時(shí),構(gòu)造函數(shù)執(zhí)行的一般次序?yàn)椋孩僬{(diào)用基類的構(gòu)造函數(shù)。②調(diào)用子對(duì)象的構(gòu)造函數(shù)。當(dāng)派生類中含有多個(gè)子對(duì)象時(shí),各子對(duì)象的構(gòu)造函數(shù)的調(diào)用順序按照它們?cè)陬愔姓f明的先后順序進(jìn)行。③執(zhí)行派生類構(gòu)造函數(shù)的函數(shù)體。21北京林業(yè)大學(xué)軟件教研室 7.2.6派生類的析構(gòu)函數(shù)析構(gòu)函數(shù)的作用是在對(duì)象撤銷之前,進(jìn)行必要的清理工作。當(dāng)對(duì)象被刪除時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用析構(gòu)函數(shù)。析構(gòu)函數(shù)的調(diào)用順序與構(gòu)造函數(shù)的調(diào)用順序正好相反:先執(zhí)行派生類自己的析構(gòu)函數(shù);然后調(diào)用子對(duì)象的析構(gòu)函數(shù);最后調(diào)用基類的析構(gòu)函數(shù)?!纠?-7】分析以下程序的執(zhí)行結(jié)果。22北京林業(yè)大學(xué)軟件教研室 練習(xí)類有兩種用法:一種是類的實(shí)例化,即生成類的對(duì)象;另一種是通過___________,派生出新的類。如果類A繼承了類B,則類A稱為___________,類B稱為___________。23北京林業(yè)大學(xué)軟件教研室 判斷題在派生類的構(gòu)造函數(shù)的初始化表中不能包含對(duì)基類的子對(duì)象的初始化。一個(gè)派生類還可以作為另一個(gè)類的派生類。派生類至少有一個(gè)基類。派生類中繼承的基類的成員的訪問權(quán)限到派生類保持不變。派生類的對(duì)象可以對(duì)它的基類成員中公有繼承的保護(hù)成員進(jìn)行訪問。派生類的構(gòu)造函數(shù)的執(zhí)行順序是:對(duì)象成員的構(gòu)造函數(shù)、基類的構(gòu)造函數(shù)、派生類本身的構(gòu)造函數(shù)?;惖乃接谐蓡T不能為派生類的成員所訪問。基類的公有成員在私有繼承時(shí)在派生類中成為私有成員,而在保護(hù)繼承時(shí)在派生類中成為保護(hù)成員。在公有和保護(hù)繼承方式下,派生類的成員可以對(duì)基類的保護(hù)成員進(jìn)行訪問。在公有和保護(hù)繼承方式下,派生類的對(duì)象可以對(duì)基類的保護(hù)成員進(jìn)行訪問。24北京林業(yè)大學(xué)軟件教研室 讀程序#includeclassBase{public:Base(){cout<<"執(zhí)行基類構(gòu)造函數(shù)"<classA{public:A(char*s){cout<classA{public:A(char*s){cout<#includeclassPerson{public:Person(char*n){name=newchar[strlen(n)+1];strcpy(name,n);}voidprint(){cout<<"Mynameis"<print();Studenty("zhang",97);p=&y;p->print();Professorz("liu","computer");p=&z;p->print();}程序運(yùn)行結(jié)果為:Mynameiswang.Mynameiszhang.Mynameisliu.程序運(yùn)行結(jié)果為:Mynameiswang.Mynameiszhangandmyscoreis97.Mynameisliuandmycourseiscomputer.將Person類中的voidprint()virtualvoidprint()50北京林業(yè)大學(xué)軟件教研室 7.4.4虛函數(shù)class類名{virtual類型函數(shù)名(參數(shù)表);};說明:(1)虛函數(shù)聲明只能出現(xiàn)在類聲明中的函數(shù)原型聲明中,而不能在成員函數(shù)的函數(shù)體實(shí)現(xiàn)的時(shí)候。(2)只有類的普通成員函數(shù)才能聲明為虛函數(shù),全局函數(shù)及靜態(tài)成員函數(shù)不能聲明為虛函數(shù)。51北京林業(yè)大學(xué)軟件教研室 (3)虛函數(shù)可以在一個(gè)或多個(gè)派生類中被重新定義,因此,它屬于函數(shù)重載的情況。它要求在派生類中重新定義時(shí)必須與基類中的函數(shù)原型完全相同。這時(shí),無論在派生類的相應(yīng)成員函數(shù)前是否加上關(guān)鍵字virtual,都將其視為虛函數(shù);系統(tǒng)會(huì)遵循以下規(guī)則來判斷一個(gè)派生類的成員函數(shù)是不是虛函數(shù):①該函數(shù)是否與基類的虛函數(shù)有相同的名稱;②該函數(shù)是否與基類的虛函數(shù)有相同的參數(shù)個(gè)數(shù)及相同的對(duì)應(yīng)參數(shù)類型;③該函數(shù)是否與基類的虛函數(shù)有相同的返回值或者滿足賦值兼容規(guī)則的指針、引用型的返回值。52北京林業(yè)大學(xué)軟件教研室 (4)當(dāng)一個(gè)類的成員函數(shù)聲明為虛函數(shù)后,就可以在該類的(直接或間接)派生類中定義與其基類虛函數(shù)原型相同的函數(shù)。這時(shí),當(dāng)用基類指針指向這些派生類對(duì)象時(shí),系統(tǒng)會(huì)自動(dòng)用派生類中的同名函數(shù)來代替基類中的虛函數(shù)。也就是說,當(dāng)用基類指針指向不同派生類對(duì)象時(shí),系統(tǒng)會(huì)在程序運(yùn)行中根據(jù)所指向?qū)ο蟮牟煌詣?dòng)選擇適當(dāng)?shù)某蓡T函數(shù),從而實(shí)現(xiàn)了運(yùn)行時(shí)的多態(tài)性。【例7-13】虛函數(shù)的定義與應(yīng)用舉例。53北京林業(yè)大學(xué)軟件教研室 運(yùn)行過程中的多態(tài)需要滿足三個(gè)條件:首先類之間應(yīng)滿足賦值兼容規(guī)則;其次是要聲明虛函數(shù);第三是要由成員函數(shù)來調(diào)用或者通過指針、引用來訪問虛函數(shù)。如果使用對(duì)象名來訪問虛函數(shù),由于聯(lián)編在編譯過程中就可以進(jìn)行(靜態(tài)聯(lián)編),而無需在運(yùn)行過程中進(jìn)行。54北京林業(yè)大學(xué)軟件教研室 讀程序#includeclassbase{private:intb;public:base(intx=0){b=x;}virtualvoidshow(){cout<<"base::b="<classBase{public:virtualvoidfun(intx){cout<<"baseclass,x="<classCAnimal{public:CAnimal();};//Animal.cpp#include"Animal.h"CAnimal::CAnimal(){cout<<"Animal!"<classCAnimal{public:CAnimal();};#endif66北京林業(yè)大學(xué)軟件教研室 【例7-16】設(shè)計(jì)一個(gè)基類Person,包含name和age兩個(gè)數(shù)據(jù)成員;由它派生出學(xué)生類Student和教師類Teacher,其中學(xué)生類添加學(xué)號(hào)no數(shù)據(jù),教師類添加職稱title數(shù)據(jù);每個(gè)類均有構(gòu)造函數(shù)和析構(gòu)函數(shù);編程實(shí)現(xiàn),并用一些數(shù)據(jù)進(jìn)行測(cè)試。PersonTeacherStudent(1)派生類的有參構(gòu)造函數(shù)中需要為基類的有參構(gòu)造函數(shù)提供參數(shù)。(2)由于在派生類中重新定義了顯示函數(shù),若要調(diào)用基類的顯示函數(shù),則需要使用Person::show()的形式。67北京林業(yè)大學(xué)軟件教研室 【例7-17】設(shè)計(jì)一個(gè)抽象類Vehicle,其中包含2個(gè)純虛函數(shù)setdata()和show();由它派生出類Car和類Truck,類Car包含名稱、顏色、載客數(shù)3個(gè)數(shù)據(jù)成員,類Truck包含名稱、顏色、載重量3個(gè)數(shù)據(jù)成員。68北京林業(yè)大學(xué)軟件教研室 小結(jié)(1)在C++中,允許以某個(gè)類為基類并用繼承的方式定義新的類,繼承性是C++的一個(gè)重要機(jī)制;C++支持單繼承和多重繼承,這樣便形成了類的層次結(jié)構(gòu),處在最高層的類具有一般特征,而越處在底層的類就越詳細(xì)、越具體。69北京林業(yè)大學(xué)軟件教研室 小結(jié)(2)派生新類需要經(jīng)歷三個(gè)步驟:吸收基類成員、改造基類成員和添加新成員。派生類繼承和吸收了基類的全部數(shù)據(jù)成員和除了構(gòu)造函數(shù)、析構(gòu)函數(shù)之外的全部成員函數(shù);對(duì)基類成員的改造包括兩個(gè)方面:一是基類成員的訪問方式問題,這由派生類定義時(shí)的訪問方式來控制;二是對(duì)基類數(shù)據(jù)成員或成員函數(shù)的覆蓋,對(duì)基類的功能進(jìn)行改造;派生類中新成員的加入是保證派生類在功能上有所發(fā)展的關(guān)鍵。70北京林業(yè)大學(xué)軟件教研室 小結(jié)(3)在多繼承關(guān)系中,被繼承的多個(gè)基類中如果有具有同名的成員時(shí),則在派生類中對(duì)該同名成員的使用會(huì)產(chǎn)生二義性,即編譯系統(tǒng)將無法知道是使用的哪個(gè)基類中的成員。為了解決該問題,我們可以采用作用域運(yùn)算符和虛基類兩種方法來實(shí)現(xiàn)。71北京林業(yè)大學(xué)軟件教研室 小結(jié)(4)賦值兼容規(guī)則是指在公有繼承的情況下,對(duì)于某些場(chǎng)合,一個(gè)派生類的對(duì)象可以作為基類對(duì)象來使用,也就是在需要基類對(duì)象的任何地方都可以使用公有派生類的對(duì)象來替代。它包括三種情況:派生類的對(duì)象可以賦值給基類對(duì)象;派生類的對(duì)象可以初始化為基類的引用;派生類對(duì)象的地址可以賦給指向基類的指針。72北京林業(yè)大學(xué)軟件教研室 小結(jié)(5)C++的多態(tài)性是通過虛函數(shù)實(shí)現(xiàn)的,在繼承環(huán)境下通過虛函數(shù)達(dá)到動(dòng)態(tài)聯(lián)編的效果,從而實(shí)現(xiàn)了程序運(yùn)行時(shí)的多態(tài)性。73北京林業(yè)大學(xué)軟件教研室

    當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

    此文檔下載收益歸作者所有

    當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
    溫馨提示:
    1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
    2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
    3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
    4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。
    最近更新
    更多
    大家都在看
    近期熱門
    關(guān)閉