


下載本文檔
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、實驗07繼承與派生(4學時)(第7章 繼承與派生)一、實驗目的(1) 學習聲明和使用類的繼承關系,聲明派生類。(2) 熟悉不同繼承方式下對基類成員的訪問控制。(3) 學習利用虛基類解決二義性問題。二、實驗任務7_1聲明一個基類 Animal。有私有整型成員變量 age,構造其派生類dog,在其成員函數SetAge(int n)中直接給age 賦值,看看會有什么問題,把age改為公有成員變量,還會有問題嗎?編程試試看。7_2聲明一個基類BaseClass有整型成員變量 Number,構造其派生類 DerivedClass,觀察構造函數和析構函數的執(zhí) 行情況。7_3聲明一個車(vehicle基類。
2、具有MaxSpeed> Weight等成員變量,Run> Stop等成員函數,由此派生出自行車 (bicycle) 類、汽車(motorcar)類。自行車(bicycle)類有高度(Height)等屬性,汽車(motorcar)類有座位 數(SeatNum)等屬性。從 bicycle和 motorcar派生出摩托車(motorcycle)類,在繼承過程中, 注意把vehicle設置為虛基類。如果不把vehicle設置為虛基類,會有什么問題?編程試試看。7_4以實驗6中的People (人員)類為基類。派生出student (學生)類,添加屬性:班號char classNo7;派生出
3、teacher (教師)類,添加屬性:職務 char principalship11、部門char departmental。從student類中派生出 graduate (研究生)類,添加屬性:專業(yè)char subject21、導師teacher adviser ;從graduate類和teacher類派生出TA (助教生)類,注意虛基類的使用。重載相應的 成員函數,測試這些類。類之間的關系如圖7-1所示。圖7-1類圖三、實驗步驟1.(編程)聲明基類 Animal,成員變量age聲明為私有的。構造派生類dog,在其成員函數 SetAge(int n)中直接對age賦值時,會出現類似以下的錯誤
4、提示:(注:在桌面創(chuàng)建一個文本文件,將輸出框的內容復制到文本文件中,再復制到Word文件中,不會出現漢字的亂碼)用private 時的結果:1> 已啟動生成:項目:cpp, 配置:Debug Win321>生成啟動時間為 2013-2-18 11:10:35。1>l nitializeBuildStatus:1> 正在創(chuàng)建"Debug'cpp.unsuccessfulbuild”,因為已指定"AlwaysCreate ”。1>CICompile:1> mai n.cpp1>f:projectscppcppmain.cpp(1
5、3):error C2248: “Animal:age ”: 無法訪問 private成員(在"Animal ”類中聲明)1>f:projectscppcppmain.cpp(8):參見"Animal:age ” 的聲明1>f:projectscppcppmain.cpp(5):參見"Animal ” 的聲明1>f:projectscppcppmain.cpp(14):error C2248: “Animal:age ”:無法訪問 private成員(在"Animal ”類中聲明)1>f:projectscppcppmain.cp
6、p(8):參見"Animal:age ” 的聲明1>f:projectscppcppmain.cpp(5):參見"Animal ” 的聲明1>1>生成失敗。1>1>已用時間 00:00:03.28=生成:成功0 個,失敗1個,最新 0 個,跳過0 個=把age改為公有變量后重新編譯就可以了。程序名:Iab7_1.cpp。程序及運行結果:lab7_1.cpp#in clude <iostream>using namespace std;class An imalprivate : /private 時出錯public:public禾口
7、 protected 正確int age;;class dog: public Animalpublic :void SetAge( int n) age=n; int GetAge() return age; ;void mai n() dog d; d.SetAge(3); cout<< "Age=" <<d.GetAge()<<endl; 用private 時的結果:1> 已啟動生成:項目:cpp, 配置:Debug Win321>生成啟動時間為 2013-2-18 11:10:35。1>l nitializeBu
8、ildStatus:1> 正在創(chuàng)建"Debug'cpp.unsuccessfulbuild ”,因為已指定"AlwaysCreate ”。 1>CICompile:1> mai n.cpp1>f:projectscppcppmain.cpp(13):error C2248: “Animal:age ”: 無法訪問 private成員(在"Animal ”類中聲明)1>f:projectscppcppmain.cpp(8):參見"Animal:age ” 的聲明1>f:projectscppcppmain.cpp
9、(5):參見"Animai ” 的聲明1>f:projectscppcppmain.cpp(14):error C2248: “Animal:age ”:無法訪問 private成員(在"Animal ”類中聲明)1>f:projectscppcppmain.cpp(8):參見"Animal:age ” 的聲明1>f:projectscppcppmain.cpp(5):參見"Animai ” 的聲明1>1>生成失敗。1>1>已用時間 00:00:03.28= 生成:成功0個,失敗 1個,最新 0個,跳過 0個=用
10、public時的結果:2.(編程)聲明一個基類 BaseClass構造其派生類 DerivedClass在構造函數和析構函數中用cout輸出提示信息,觀察構造函數和析構函數的執(zhí)行情況。程序名:Iab7_2.cpp。參考的運行結果:程序及運行結果:lab7_2.cpp#in elude <iostream>using namespace std;class BaseClasspublic :BaseClass() cout<< "構造了一個 BaseClass 類的對象."<<endl; BaseClass() cout<<&q
11、uot;析構了一個 BaseClass 類的對象."<<endl; private :int Number;class DeriveClass: public BaseClasspublic :DeriveClass() cout<< "構造了一個 DeriveClass 類的對象."<<endl; DeriveClass() cout<<"析構了一個 DeriveClass 類的對象."<<endl; ;void mai n() DeriveClass a; 3.(操作)用調試功能跟
12、蹤程序Iab7_2的執(zhí)行過程觀察基類和派生類的構造函數和析構函數的執(zhí)行情況。4.(編程)聲明一個車(vehicle虛基類。由此派生出自行車(bicycle)類、汽車(motorcar)類,注意把vehicle派生為虛基類。再從 bicycle和motorcar派生出摩托車(motorcycle)類,在 main()函數中測試這個類。程序名: lab7_3.cpp。參考的運行結果:程序及運行結果:lab7_3.cpp#in elude <iostream>using namespace std;class vehicle /車類,作為基類protected :int MaxSpeed
13、,Weight; / 最大速度,重量public:void Run() cout<< "車 vehicle 類開始運行!"<<endl; void Stop() cout<< "車 vehicle 類停止運行!"<<endl; ;class bicycle: virtual public vehicle / 自行車類:公有繼承虛基類vehicleprotected :int Height; / 高度;class motorcar: virtual public vehicle /汽車類:公有繼承虛基類veh
14、icle protected :int SeatNum; / 座位數;class motorcycle:public bicycle, public motorcar /摩托車類:公有繼承自行車類和汽車類 public:void Setdata( int ms, int wt, int ht, int sn) MaxSpeed=ms; Weight=wt; Height=ht; SeatNum=s n; ;void Show()cout<< "最大速度:"<<MaxSpeed<< " 重量:"<<Weigh
15、t<< " 高度:"<<Height<< " 座位數:"<<SeatNum<<endl;void mai n()cout<< "int 類型占用字節(jié)數:"<< sizeof(int)<<endl;cout<< "vehicle 占用字節(jié)數:"<< sizeof (vehicle)<<endl;cout<< "bicycle 占用字節(jié)數:"<<
16、 sizeof (bicycle)<<endl;cout<< "motorcar 占用字節(jié)數:"<< sizeof (motorcar)<<endl;cout<< "motorcycle 占用字節(jié)數 :"<< sizeof (motorcycle)<<endl;motorcycle mt;mt.Ru n();mt.Setdata(100,200,130,2);mt.Show();mt.Stop();為什么?按推算應該是:vehicle占用8字節(jié);bicycle占用12字節(jié)
17、;motorcar占用12字節(jié);motorcycle 占用 16 字節(jié)。5.(驗證)把vehicle設置為非虛基類。再編譯一次,此時系統(tǒng)報錯,無法編譯成功。這是因為若不把vehicle設置為虛基類,會出現二義性錯誤,程序不能成功編譯。訪問vehicle的成員時指明繼承路徑后,可以糾正二義性錯誤,試修改程序,然后運行。程序的運行結果:(1)沒有指明繼承路徑(運行結果)將上面的程序的 bicycle類和motorcar類改為非虛基類公有繼承vehicle類后,編譯時出現二義(ambiguous)性錯誤:1> 已啟動生成:項目:cpp, 配置:Debug Win321>生成啟動時間為 2
18、013-2-18 11:23:32。1>l nitializeBuildStatus:1> 正在創(chuàng)建"Debug'cpp.unsuccessfulbuild”,因為已指定"AlwaysCreate ”。1>CICompile:1> mai n.cpp1>f:projectscppcppmain.cpp(27): error C2385:對"MaxSpeed 的訪問不明確1>可能是"MaxSpeed (位于基"vehicle ”中)1>也可能是"MaxSpeed'(位于基&quo
19、t;vehicle ”中)1>f:projectscppcppmain.cpp(27): error C2385:對"Weight ” 的訪問不明確1>可能是"Weight ” (位于基"vehicle ”中)1>也可能是“ Weight ”(位于基“1>f:projectscppcppma in. cpp(29): error C2385: 1>可能是"MaxSpeed (位于基"1>也可能是"MaxSpeed'(位于基1>f:projectscppcppma in. cpp(30)
20、: error C2385:vehicle ”中)對"MaxSpeed"的訪問不明確vehicle ”中)“ vehicle ”中)對"Weight ”的訪問不明確1>可能是"Weight ” (位于基"vehicle ”中)1>也可能是"Weight"(位于基"vehicle ”中)1>f:projectscppcppmain.cpp(42): error C2385:對"Rur” 的訪問不明確1>可能是"Rur”(位于基"vehicle ”中)1>也可
21、能是"Run"(位于基"vehicle ”中)1>f:projectscppcppmain.cpp(42): error C3861:“ Run":找不到標識符1>f:projectscppcppmain.cpp(45): error C2385:對"Stop” 的訪問不明確1>可能是"Stop ” (位于基"vehicle ”中)1>也可能是"Stop ” (位于基"vehicle ”中)1>f:projectscppcppmain.cpp(45): error C3861
22、:“ Stop ” :找不到標識符 1> 1生成失敗。11已用時間 00:00:01.07=生成:成功0 個,失敗1個,最新 0 個,跳過0 個=(2)指明繼承路徑(程序及運行結果)將vehicle中數據成員和函數成員指明路徑。lab7_3.cpp#in clude <iostream>using namespace std;class vehicle /車類,作為基類protected :int MaxSpeed,Weight; / 最大速度,重量public :void Run() cout<< "車 vehicle 類開始運行!"<
23、<endl; void Stop() cout<< "車 vehicle 類停止運行!"<<endl; ;class bicycle: public vehicle / 自行車類:公有繼承虛基類vehicleprotected :int Height; / 高度;class motorcar: public vehicle /汽車類:公有繼承虛基類vehicleprotected :int SeatNum; / 座位數;class motorcycle:public bicycle, public motorcar /摩托車類:公有繼承自行車類
24、和汽車類public :void Setdatabicycle( int ms, int wt, int ht, int sn)bicycle:MaxSpeed=ms; bicycle:Weight=wt; / 修改,指明路徑Height=ht; SeatNum=s n;void Showbicycle()cout<< "最大速度:"<<bicycle:MaxSpeed<< "重量:"<<bicycle:Weight<< " 高度:"<<Height<<
25、; " 座位數:"<<SeatNum<<endl; / 修改,指明路徑;void mai n()cout<< "int 類型占用字節(jié)數:"<< sizeof(int)<<endl;cout<< "vehicle 占用字節(jié)數:"<< sizeof (vehicle)<<endl;cout<< "bicycle 占用字節(jié)數:"<< sizeof (bicycle)<<endl;cout&l
26、t;< "motorcar 占用字節(jié)數:"<< sizeof (motorcar)<<endl;cout<< "motorcycle 占用字節(jié)數 :"<< sizeof (motorcycle)<<endl;motorcycle mt;mt.bicycle:Ru n();/ 修改,指明路徑mt.Setdatabicycle(100,200,130,2);mt.Showbicycle();mt.motorcar:Stop(); / 修改,指明路徑6.以實驗6中的people (人員)類為基類
27、,派生相應的類按任務7_4的要求編寫程序,并運行。參考的運行結果:芭 CzflHDOTSdyst0B32»d< ftxail|QI 亠、10 1:1985日01兒年伽助山eiFle學丨 ';1965X)- 日:學系a- I 17壽所 :授塞生3TT 1 20-:今日證:入茗號別生份口亞師名號別生份務門書姓編性岀身班專莓編性岀|>職番助艸山Bll 1:lle學武Bl學E- 笳最- 壽所繼I :攔.牛匕左_鋰 砥101書號20:數王士士意一日UE-1 日證:出名號別善口並師名號別告音程序及運行結果:(1) Iab6_7.h : People (人員)類的聲明及成員函數
28、的實現lab6_7.h#in elude <iostream>#in elude <cstri ng>using namespaee std;class Dateprivate :int yy,mm,dd;public :Date() Date(Date &d) : yy(d.yy),mm(d.mm),dd(d.dd)/ 增添Date() int Getyy() const return yy; int Getmm() const return mm; int Getdd()const return dd; void Setyy( int y) yy=y; vo
29、id Setmm( int m) mm=m; void Setdd( int d) dd=d; ;class Peopleprivate :char n ame11;/ 姓名,增添char number7;/編號,改為數組char sex3;/男或女,改為數組Date birthday;char id16;public :People()People(People &p);People()/出生日期/身份證號,改為數組void Getname( char na) strcpy(na,name); void Getnumber( char nu) strcpy(nu,number); v
30、oid Getsex( char se)strcpy(se,sex); int Getbirthyy() con st retur n birthday.Getyy(); int Getbirthmm() con st return birthday.Getmm(); int Getbirthdd() con st return birthday.Getdd(); void Getid( char d) strcpy(d,id); void Setname( char na) strcpy(name,na); void Setnumber( char nu) strcpy(number,nu)
31、; void Setsex( char se)strcpy(sex,se); void Setbirthyy( int y) birthday.Setyy(y); void Setbirthmm( int m) birthday.Setmm(m); void Setbirthdd( int d) birthday.Setdd(d); void Setid( char d) strcpy(id,d); void in put();void output();People:People(People &p):birthday(p.birthday)strcpy( name,p. name)
32、;strcpy(number ,p.number);strcpy(sex,p.sex);strcpy(id,p.id);inline void People:input()cout<< "姓名:"cin»name;cout<< "編號:"cin»number;cout<< "性別(男/女):" cin>>sex;cout<< "出生日期(年 月 日):";int y,m,d; cin»y> >m»d;Se
33、tbirthyy(y); Setbirthmm(m); Setbirthdd(d);cout<< "身份證號:"cin>>id;inline void People:output()cout<< "姓名:"<<name<< "n 編號:"<<number<<endl;cout<< "性別:"<<sex<<endl;cout<< "出生日期:"<<Getb
34、irthyy()<<"年”<<Getbirthmm()<< "月"<<Getbirthdd()<< "日"<<endl;cout<< "身份證號:"<<id<<endl;(2) Iab7_4.h : People類的派生類lab7_4.h#i nclude "lab6_7.h"class student: virtual public People / 學生類private :char classN
35、o7; / 班號public :/使用類型兼容規(guī)則stude nt()stude nt(stude nt &st):People(st) strcpy(classNo,st.classNo); stude nt()void GetclassNo( char cNo) strcpy(cNo,classNo); void SetclassNo( char *c) strcpy(classNo,c); void in put() People:i nput(); cout<<"班號:"cin >>classNo; void output() Peo
36、ple:output(); cout<<"班號:"<<classNo<<e ndl; ;class teacher: virtual public People / 教師類private :char prin cipalship11; / 職務char departme nt21; / 部門public :teacher()teacher(teacher &t):People(t)strcpy(pri ncipalship,t.pri ncipalship); strcpy(departme nt,t.departme nt);t
37、eacher()void Getprincipalship( char *pri) strcpy(pri,principalship); void Getdepartment( char *dep) strcpy(dep,department); void Setprincipalship( char *pri) strcpy(principalship,pri); void Setdepartment( char *dep) strcpy(department,dep); void in put() People:i nput();cout<< "職務:"ci
38、n>>principalship;cout<< "部門:”;cin>> department;void output()People:output();cout<< "職務:"<<principalship<<endl;cout<< "部門:"<<department<<endl;;class graduate: public student / 研究生類private :char subject21; / 專業(yè)teacher advis
39、er; / 導師public :graduate()graduate(graduate &g):stude nt(g),adviser(g.adviser) strcpy(subject,g.subject); graduate()void GetSubject( char* sb) strcpy(sb,subject); void Getadviser(teacher &ad)char na11; adviser .Getname(na); ad.Setname(na);char nb7; adviser .Getnumber(nb); ad.Setnumber(nb);ch
40、ar se3; adviser .Getsex(se); ad.Setsex(se);ad.Setbirthyy(adviser .Getbirthyy();ad.Setbirthmm(adviser .Getbirthmm();ad.Setbirthdd(adviser .Getbirthdd();char id016; adviser .Getid(id0); ad.Setid(id0);char pp11; adviser .Getprincipalship(pp); ad.Setprincipalship(pp);char dp21; adviser .Getdepartment(dp); ad.Setdepartment(dp);void SetSubject( char* sb) strcpy(subject,sb); void Setadviser(teacher &ad)char n a11; ad.Get name (n a); adviser.Set name( na);char n b7; ad.Get nu mber( nb); adviser.Set nu mber( nb);char se3; ad.Getsex(se); adviser .Setsex(se);adviser .Setbirthyy(a
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 跨境支付生態(tài)協(xié)同創(chuàng)新模式-全面剖析
- 2025年中國爐磚數據監(jiān)測報告
- 食品冷鏈物流研究-全面剖析
- 2024年惠州仲愷高新區(qū)招聘中小學教師筆試真題
- 2024年巴中市招聘省屬公費師范畢業(yè)生筆試真題
- 摩托車駕駛行為分析與優(yōu)化-全面剖析
- 試驗機制造產業(yè)政策分析-全面剖析
- 高功率激光微納制造技術-全面剖析
- 跨國鐵路運輸合作機制-全面剖析
- 旅游景區(qū)產業(yè)分析報告
- 2025年初中語文名著閱讀《林海雪原》知識點總結及練習
- 西部計劃考試考題及答案
- 譯林版英語三年級下冊單詞表
- 學校德育管理體系
- 青年博物館文創(chuàng)產品消費研究:一個社會實踐分析視角
- 政策實施效果評估模型-深度研究
- 2025版學校學生食堂餐具清洗消毒服務合同2篇
- 學校基金會的資金籌集與運用策略
- 調度室副主任安全生產職責模版(3篇)
- 虛擬現實導覽設計-洞察分析
- 【儲能】工商業(yè)儲能業(yè)務開發(fā)要點及策略分享
評論
0/150
提交評論