第7章繼承與派生1_第1頁(yè)
第7章繼承與派生1_第2頁(yè)
第7章繼承與派生1_第3頁(yè)
第7章繼承與派生1_第4頁(yè)
第7章繼承與派生1_第5頁(yè)
已閱讀5頁(yè),還剩35頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

本章簡(jiǎn)介第1章概述7.1類的繼承與派生(掌握)7.2訪問控制(掌握)7.3類型兼容規(guī)則(理解)7.4派生類的構(gòu)造、析構(gòu)函數(shù)(掌握)7.5派生類的標(biāo)識(shí)與訪問(掌握)1繼承與派生的目的繼承的目的:實(shí)現(xiàn)代碼重用。派生的目的:當(dāng)新的問題出現(xiàn),原有程序無法解決(或不能完全解決)時(shí),需要對(duì)原有程序進(jìn)行改造。類的繼承與派生2類的繼承與派生的概念保持已有類的特性而構(gòu)造新類的過程稱為繼承。在已有類的基礎(chǔ)上新增自己的特性而產(chǎn)生新類的過程稱為派生。被繼承的已有類稱為基類(或父類)。派生出的新類稱為派生類。類的繼承與派生3繼承與派生問題舉例1類的繼承與派生4派生類的聲明class派生類名:繼承方式基類名{成員聲明;};類的繼承與派生classStudent

{intnum;

charname[30];

charsex; public: voiddisplay()//對(duì)成員函數(shù)display的定義 { cout<<"num:"<<num<<endl; cout<<"name:"<<name<<endl; cout<<"sex:"<<sex<<endl;} };5classStudend1{intnum; //此行原來己有charname[20]; //此行原來己有charsex; //此行原來己有

intage;charaddr[20];public:voiddisplay()//此行原來己有{cout<<"num:"<<num<<endl;//此行原來己有cout<<"name:"<<name<<endl;//此行原來己有cout<<"sex:"<<sex<<endl;//此行原來己有

cout<<"age:"<<age<<endl;cout<<"address:"<<addr<<endl;}};類的繼承與派生6利用原來定義的類Student作為基礎(chǔ),再加上新的內(nèi)容即可,以減少重復(fù)的工作量。C++提供的繼承機(jī)制就是為了解決這個(gè)問題的。在C++中,所謂“繼承”就是在一個(gè)已存在的類的基礎(chǔ)上建立一個(gè)新的類。已存在的類稱為“基類(baseclass)”或“父類(fatherclass)”。新建立的類稱為“派生類(derivedclass)”或“子類(sonclass)”。類的繼承與派生7classStudent1:publicStudent//聲明基類是Student{

intage; //新增加的數(shù)據(jù)成員stringaddr;//新增加的數(shù)據(jù)成員public:

voiddisplay_1()//新增加的成員函數(shù){cout<<"age:"<<age<<endl;cout<<"address:"<<addr<<endl;}};類的繼承與派生8派生類的構(gòu)成9繼承方式不同繼承方式的影響主要體現(xiàn)在:派生類成員對(duì)基類成員的訪問權(quán)限派生類對(duì)象對(duì)基類成員的訪問權(quán)限三種繼承方式公有繼承私有繼承保護(hù)繼承類的繼承與派生10公有繼承(public)基類的public和protected成員的訪問屬性在派生類中保持不變,但基類的private成員不可直接訪問。派生類中的成員函數(shù)可以直接訪問基類中的public和protected成員,但不能直接訪問基類的private成員。通過派生類的對(duì)象只能訪問基類的public成員。類成員的訪問控制11公有繼承舉例類成員的訪問控制classBase{public:intb1;protected:intb2;private:intb3;};classD1:publicBase{public:voidtest(){b1=10;//ok,b1為publicb2=20;//ok,b2為protectedb3=30;//error}};12類成員的訪問控制voidmain(){D1d1;d1.b1=1;//okd1.b2=2;d1.b3=3;D2d2;d2.b1=4;d2.b2=5;d2.b3=6;D3d3;d3.b1=7;d3.b2=8;d3.b3=9;}13私有繼承(private)基類的public和protected成員都以private身份出現(xiàn)在派生類中,基類的private成員不可直接訪問。派生類中的成員函數(shù)可以直接訪問基類中的public和protected成員,但不能直接訪問基類的private成員。通過派生類的對(duì)象不能直接訪問基類中的任何成員。類成員的訪問控制14私有繼承舉例classBase{public:intb1;protected:intb2;private:intb3;};classD2:privateBase{public:voidtest(){b1=8;//okb2=9;//ok b3=10;//error}};類成員的訪問控制15保護(hù)繼承(protected)基類的public和protected成員都以protected身份出現(xiàn)在派生類中,基類的private成員不可直接訪問。派生類中的成員函數(shù)可以直接訪問基類中的public和protected成員,但不能直接訪問基類的private成員。通過派生類的對(duì)象不能直接訪問基類中的任何成員類成員的訪問控制16protected成員的特點(diǎn)與作用對(duì)建立其所在類對(duì)象的模塊來說,它與private成員的性質(zhì)相同。對(duì)于其派生類來說,它與public成員的性質(zhì)相同。既實(shí)現(xiàn)了數(shù)據(jù)隱藏,又方便繼承,實(shí)現(xiàn)代碼重用。類成員的訪問控制17類成員的訪問控制classBase{public:intb1;protected:intb2;private:intb3;};

classD3:protectedBase{public:voidtest(){b1=15;//okb2=16;//okb3=17;//error}};18通過繼承關(guān)系,派生類包含了它的所有基類的成員。派生類對(duì)象的數(shù)據(jù)結(jié)構(gòu)由基類中說明的數(shù)據(jù)成員和派生類中說明的數(shù)據(jù)成員共同構(gòu)成。在創(chuàng)建派生類對(duì)象時(shí),派生類對(duì)象的初始化,不僅要給派生類中的數(shù)據(jù)成員初始化,還要給它的基類中的數(shù)據(jù)成員初始化。如果派生類中還有子對(duì)象時(shí),還應(yīng)包含對(duì)子對(duì)象初始化。派生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)191、派生類的構(gòu)造函數(shù)

<派生類名>(<總參數(shù)表>):<基類構(gòu)造函數(shù)名>(<參數(shù)表1>),<子對(duì)象名>(<參數(shù)表2>){//<派生類中數(shù)據(jù)成員的初始化>}構(gòu)造函數(shù)的調(diào)用順序如下:

基類構(gòu)造函數(shù);子類構(gòu)造函數(shù);派生類構(gòu)造函數(shù)。202、派生類的析構(gòu)函數(shù)執(zhí)行派生類的析構(gòu)函數(shù)時(shí),也要調(diào)用基類及子對(duì)象的析構(gòu)函數(shù)。析構(gòu)順序如下:先調(diào)用派生類的析構(gòu)函數(shù);子對(duì)象的析構(gòu)函數(shù);基類的析構(gòu)函數(shù)。21#include<iostream.h>classBase{public:Base(){cout<<“\nBasecreated\n”;}};classD_class:publicBase{public:D_class(){cout<<“D_classcreated\n”;}};voidmain(){D_classd;}例如:下面程序顯示了構(gòu)造函數(shù)的執(zhí)行順序

運(yùn)行結(jié)果:BasecreatedD_classcreated先執(zhí)行基類的構(gòu)造函數(shù),再執(zhí)行派生類的構(gòu)造函數(shù);執(zhí)行缺省的析構(gòu)函數(shù)時(shí),先執(zhí)行派生類,再執(zhí)行基類。22例如:分析程序的輸出結(jié)果,分析派生類構(gòu)造函數(shù)及析構(gòu)函數(shù)的特點(diǎn)。#include<iostream.h>classA{public:A(){a=0;}A(inti){a=i;}voidprint(){cout<<a<<“,”;}private:inta;};23classB:publicA{public:B(){b1=b2=0;}//調(diào)用基類A的缺省構(gòu)造函數(shù)B(inti){b1=0;b2=i;}//調(diào)用A的缺省構(gòu)造函數(shù)B(inti;intj,intk):A(i),b1(j),b2(k){}//調(diào)用基類A的帶參構(gòu)造函數(shù)voidprint(){A::print();cout<<b1<<“,”<<b2<<endl;}private:intb1,b2;};24voidmain(){Bb1;Bb2(5);Bb3(1,2,3);b1.print();b2.print();b3.print();}0,0,1,0,00,52,3結(jié)果:25注意:程序中對(duì)象b1,b2,b3調(diào)用了不同的三個(gè)構(gòu)造函數(shù)實(shí)現(xiàn)初始化過程,其內(nèi)存分配情況如下圖所示。000ab1b2A()創(chuàng)建B()創(chuàng)建b1005ab1b2B(inti)創(chuàng)建b2A()創(chuàng)建123ab1b2B(inti,intj,intk)創(chuàng)建b3A(inti)創(chuàng)建可見,創(chuàng)建b1,b2,b3三個(gè)對(duì)象共調(diào)用三次基類A的構(gòu)造函數(shù),三次派生類B本身的構(gòu)造函數(shù)。析構(gòu)時(shí)也調(diào)用了六次析構(gòu)函數(shù),析構(gòu)次序與構(gòu)造次序相反。26例如:下面程序中派生類的數(shù)據(jù)成員為另一個(gè)類的對(duì)象,分析輸出結(jié)果

#include<iostream.h>#include<string.h>classAdvisor{intnoofmeetings;};classStudent{public:Student(char*pname=“noname”){srtcpy(name,pname,);average=semesterhours=0;}27voidaddcourse(inthours,floatgrade){average=semesterhours*average+grade;//總分semesterhours+=hours;//總修學(xué)時(shí)數(shù)average/=semesterhours;//平均分}intgethours(){returnsemesterhours;}floatgetaverage(){returnaverage;}28

voiddisplay(){cout<<“name=”<<name<<“,hours=”<<semesterhours<<“,average=”<<average<<endl;}protected:charname[40];intsemesterhours;floataverage;};classGraduatestudent:publicStudent{public:getqulifier(){returnqualifiergrade;}29

protected:Advisoradvisor;//類對(duì)象成員intqualifiergrade;};voidmain(){Studentds(“Wangmingundergrade”);Graduatestudentgs;ds.addcourse(3,2.5);ds.display();gs.addcourse(3,3.0);//派生類對(duì)象訪問公共成員函數(shù)gs.display();}30結(jié)果:name=Wangmingundergrade,hours=3,average=0.8333333name=noname,hours=3,average=1派生類對(duì)象gs的創(chuàng)建初始化過程如圖所示:……name[40]semesterhoursaveragenoofmetingsqualifergradegs對(duì)象的內(nèi)存空間調(diào)用基類構(gòu)造函數(shù)初始化調(diào)用Advisor類構(gòu)造函數(shù)初始化調(diào)用Graduatestudent派生類本身的構(gòu)造函數(shù)初始化31類型兼容規(guī)則一個(gè)公有派生類的對(duì)象在使用上可以被當(dāng)作基類的對(duì)象,反之則禁止。具體表現(xiàn)在:派生類的對(duì)象可以被賦值給基類對(duì)象。派生類的對(duì)象可以初始化基類的引用。派生類對(duì)象的地址可以賦給指向基類的指針。通過基類對(duì)象名、指針只能使用從基類繼承的成員類型兼容32單一繼承時(shí)的構(gòu)造函數(shù)派生類名::派生類名(基類所需的形參,本類成員所需的形參):基類名(參數(shù)表){本類成員初始化賦值語(yǔ)句;};派生類的構(gòu)造、析構(gòu)函數(shù)繼承時(shí)的構(gòu)造函數(shù)總結(jié)33繼承時(shí)的構(gòu)造函數(shù)總結(jié)基類的構(gòu)造函數(shù)不被繼承,派生類中需要聲明自己的構(gòu)造函數(shù)。聲明構(gòu)造函數(shù)時(shí),只需要對(duì)本類中新增成員進(jìn)行初始化,對(duì)繼承來的基類

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論