C++語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)答案-繼承與派生(共15頁(yè))_第1頁(yè)
C++語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)答案-繼承與派生(共15頁(yè))_第2頁(yè)
C++語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)答案-繼承與派生(共15頁(yè))_第3頁(yè)
C++語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)答案-繼承與派生(共15頁(yè))_第4頁(yè)
C++語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)答案-繼承與派生(共15頁(yè))_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上實(shí)驗(yàn)07 繼承與派生(4學(xué)時(shí))(第7章 繼承與派生)一、實(shí)驗(yàn)?zāi)康?1) 學(xué)習(xí)聲明和使用類的繼承關(guān)系,聲明派生類。(2) 熟悉不同繼承方式下對(duì)基類成員的訪問(wèn)控制。(3) 學(xué)習(xí)利用虛基類解決二義性問(wèn)題。二、實(shí)驗(yàn)任務(wù)7_1 聲明一個(gè)基類Animal。有私有整型成員變量age,構(gòu)造其派生類dog,在其成員函數(shù)SetAge(int n)中直接給age賦值,看看會(huì)有什么問(wèn)題,把a(bǔ)ge改為公有成員變量,還會(huì)有問(wèn)題嗎?編程試試看。7_2 聲明一個(gè)基類BaseClass。有整型成員變量Number,構(gòu)造其派生類DerivedClass,觀察構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行情況。7_3 聲明一個(gè)

2、車(chē)(vehicle)基類。具有MaxSpeed、Weight等成員變量,Run、Stop等成員函數(shù),由此派生出自行車(chē)(bicycle)類、汽車(chē)(motorcar)類。自行車(chē)(bicycle)類有高度(Height)等屬性,汽車(chē)(motorcar)類有座位數(shù)(SeatNum)等屬性。從bicycle和motorcar派生出摩托車(chē)(motorcycle)類,在繼承過(guò)程中,注意把vehicle設(shè)置為虛基類。如果不把vehicle設(shè)置為虛基類,會(huì)有什么問(wèn)題?編程試試看。7_4 以實(shí)驗(yàn)6中的People(人員)類為基類。派生出student(學(xué)生)類,添加屬性:班號(hào)char classNo7;派生出te

3、acher(教師)類,添加屬性:職務(wù)char principalship11、部門(mén)char department21。從student類中派生出graduate(研究生)類,添加屬性:專業(yè)char subject21、導(dǎo)師teacher adviser;從graduate類和teacher類派生出TA(助教生)類,注意虛基類的使用。重載相應(yīng)的成員函數(shù),測(cè)試這些類。類之間的關(guān)系如圖7-1所示。研究生 專業(yè) 導(dǎo)師 函數(shù) 日期 年 月 日 函數(shù) 助教博士生 教師 職務(wù) 部門(mén) 函數(shù) 學(xué)生 班號(hào) 函數(shù) 人員 姓名 編號(hào) 性別 出生日期 身份證號(hào) 函數(shù) 圖7-1 類圖三、實(shí)驗(yàn)步驟1.(編程)聲明基類Ani

4、mal,成員變量age聲明為私有的。構(gòu)造派生類dog,在其成員函數(shù)SetAge(int n)中直接對(duì)age賦值時(shí),會(huì)出現(xiàn)類似以下的錯(cuò)誤提示:(注:在桌面創(chuàng)建一個(gè)文本文件,將輸出框的內(nèi)容復(fù)制到文本文件中,再?gòu)?fù)制到Word文件中,不會(huì)出現(xiàn)漢字的亂碼)用private時(shí)的結(jié)果:1>- 已啟動(dòng)生成: 項(xiàng)目: cpp, 配置: Debug Win32 -1>生成啟動(dòng)時(shí)間為 2013-2-18 11:10:35。1>InitializeBuildStatus:1> 正在創(chuàng)建“Debugcpp.unsuccessfulbuild”,因?yàn)橐阎付ā癆lwaysCreate”。1>C

5、lCompile:1> main.cpp1>f:projectscppcppmain.cpp(13): error C2248: “Animal:age”: 無(wú)法訪問(wèn) private 成員(在“Animal”類中聲明)1> f:projectscppcppmain.cpp(8) : 參見(jiàn)“Animal:age”的聲明1> f:projectscppcppmain.cpp(5) : 參見(jiàn)“Animal”的聲明1>f:projectscppcppmain.cpp(14): error C2248: “Animal:age”: 無(wú)法訪問(wèn) private 成員(在“Ani

6、mal”類中聲明)1> f:projectscppcppmain.cpp(8) : 參見(jiàn)“Animal:age”的聲明1> f:projectscppcppmain.cpp(5) : 參見(jiàn)“Animal”的聲明1>1>生成失敗。1>1>已用時(shí)間 00:00:03.28= 生成: 成功 0 個(gè),失敗 1 個(gè),最新 0 個(gè),跳過(guò) 0 個(gè) =把a(bǔ)ge改為公有變量后重新編譯就可以了。程序名:lab7_1.cpp。 程序及運(yùn)行結(jié)果:/lab7_1.cpp#include <iostream>using namespace std;class Animalp

7、rivate: /private時(shí)出錯(cuò)/public:/public和protected正確int age;class dog:public Animalpublic:void SetAge(int n) age=n; int GetAge() return age; ;void main() dog d; d.SetAge(3); cout<<"Age="<<d.GetAge()<<endl; 用private時(shí)的結(jié)果:1>- 已啟動(dòng)生成: 項(xiàng)目: cpp, 配置: Debug Win32 -1>生成啟動(dòng)時(shí)間為 2013-2

8、-18 11:10:35。1>InitializeBuildStatus:1> 正在創(chuàng)建“Debugcpp.unsuccessfulbuild”,因?yàn)橐阎付ā癆lwaysCreate”。1>ClCompile:1> main.cpp1>f:projectscppcppmain.cpp(13): error C2248: “Animal:age”: 無(wú)法訪問(wèn) private 成員(在“Animal”類中聲明)1> f:projectscppcppmain.cpp(8) : 參見(jiàn)“Animal:age”的聲明1> f:projectscppcppmain.

9、cpp(5) : 參見(jiàn)“Animal”的聲明1>f:projectscppcppmain.cpp(14): error C2248: “Animal:age”: 無(wú)法訪問(wèn) private 成員(在“Animal”類中聲明)1> f:projectscppcppmain.cpp(8) : 參見(jiàn)“Animal:age”的聲明1> f:projectscppcppmain.cpp(5) : 參見(jiàn)“Animal”的聲明1>1>生成失敗。1>1>已用時(shí)間 00:00:03.28= 生成: 成功 0 個(gè),失敗 1 個(gè),最新 0 個(gè),跳過(guò) 0 個(gè) =用public時(shí)

10、的結(jié)果:2.(編程)聲明一個(gè)基類BaseClass,構(gòu)造其派生類DerivedClass。在構(gòu)造函數(shù)和析構(gòu)函數(shù)中用cout輸出提示信息,觀察構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行情況。程序名:lab7_2.cpp。參考的運(yùn)行結(jié)果: 程序及運(yùn)行結(jié)果:/lab7_2.cpp#include <iostream>using namespace std;class BaseClasspublic:BaseClass() cout<<"構(gòu)造了一個(gè)BaseClass類的對(duì)象."<<endl; BaseClass() cout<<"析構(gòu)了一個(gè)B

11、aseClass類的對(duì)象."<<endl; private:int Number;class DeriveClass:public BaseClasspublic:DeriveClass() cout<<"構(gòu)造了一個(gè)DeriveClass類的對(duì)象."<<endl; DeriveClass() cout<<"析構(gòu)了一個(gè)DeriveClass類的對(duì)象."<<endl; ;void main() DeriveClass a; 3.(操作)用調(diào)試功能跟蹤程序lab7_2的執(zhí)行過(guò)程。觀察基類和派

12、生類的構(gòu)造函數(shù)和析構(gòu)函數(shù)的執(zhí)行情況。4.(編程)聲明一個(gè)車(chē)(vehicle)虛基類。由此派生出自行車(chē)(bicycle)類、汽車(chē)(motorcar)類,注意把vehicle派生為虛基類。再?gòu)腷icycle和motorcar派生出摩托車(chē)(motorcycle)類,在main()函數(shù)中測(cè)試這個(gè)類。程序名:lab7_3.cpp。參考的運(yùn)行結(jié)果: 程序及運(yùn)行結(jié)果:/lab7_3.cpp#include <iostream>using namespace std;class vehicle/車(chē)類,作為基類protected:int MaxSpeed,Weight;/最大速度,重量public:

13、void Run() cout<<"車(chē)vehicle類開(kāi)始運(yùn)行!"<<endl; void Stop() cout<<"車(chē)vehicle類停止運(yùn)行!"<<endl; ;class bicycle:virtual public vehicle/自行車(chē)類:公有繼承虛基類vehicleprotected:int Height;/高度;class motorcar:virtual public vehicle/汽車(chē)類:公有繼承虛基類vehicleprotected:int SeatNum;/座位數(shù);class mo

14、torcycle:public bicycle,public motorcar/摩托車(chē)類:公有繼承自行車(chē)類和汽車(chē)類public:void Setdata(int ms,int wt,int ht,int sn) MaxSpeed=ms; Weight=wt; Height=ht; SeatNum=sn; ;void Show()cout<<"最大速度:"<<MaxSpeed<<" 重量:"<<Weight<<" 高度:"<<Height<<"

15、 座位數(shù):"<<SeatNum<<endl;void main()cout<<"int類型占用字節(jié)數(shù): "<<sizeof(int)<<endl;cout<<"vehicle占用字節(jié)數(shù): "<<sizeof(vehicle)<<endl;cout<<"bicycle占用字節(jié)數(shù): "<<sizeof(bicycle)<<endl;cout<<"motorcar占用字節(jié)數(shù): &

16、quot;<<sizeof(motorcar)<<endl;cout<<"motorcycle占用字節(jié)數(shù): "<<sizeof(motorcycle)<<endl;motorcycle mt;mt.Run();mt.Setdata(100,200,130,2);mt.Show();mt.Stop();為什么?按推算應(yīng)該是:vehicle占用8字節(jié);bicycle占用12字節(jié);motorcar占用12字節(jié);motorcycle占用16字節(jié)。5.(驗(yàn)證)把vehicle設(shè)置為非虛基類。再編譯一次,此時(shí)系統(tǒng)報(bào)錯(cuò),無(wú)法編譯

17、成功。這是因?yàn)槿舨话裿ehicle設(shè)置為虛基類,會(huì)出現(xiàn)二義性錯(cuò)誤,程序不能成功編譯。訪問(wèn)vehicle的成員時(shí)指明繼承路徑后,可以糾正二義性錯(cuò)誤,試修改程序,然后運(yùn)行。 程序的運(yùn)行結(jié)果:(1) 沒(méi)有指明繼承路徑(運(yùn)行結(jié)果)將上面的程序的bicycle類和motorcar類改為非虛基類公有繼承vehicle類后,編譯時(shí)出現(xiàn)二義(ambiguous)性錯(cuò)誤:1>- 已啟動(dòng)生成: 項(xiàng)目: cpp, 配置: Debug Win32 -1>生成啟動(dòng)時(shí)間為 2013-2-18 11:23:32。1>InitializeBuildStatus:1> 正在創(chuàng)建“Debugcpp.uns

18、uccessfulbuild”,因?yàn)橐阎付ā癆lwaysCreate”。1>ClCompile:1> main.cpp1>f:projectscppcppmain.cpp(27): error C2385: 對(duì)“MaxSpeed”的訪問(wèn)不明確1> 可能是“MaxSpeed”(位于基“vehicle”中)1> 也可能是“MaxSpeed”(位于基“vehicle”中)1>f:projectscppcppmain.cpp(27): error C2385: 對(duì)“Weight”的訪問(wèn)不明確1> 可能是“Weight”(位于基“vehicle”中)1>

19、也可能是“Weight”(位于基“vehicle”中)1>f:projectscppcppmain.cpp(29): error C2385: 對(duì)“MaxSpeed”的訪問(wèn)不明確1> 可能是“MaxSpeed”(位于基“vehicle”中)1> 也可能是“MaxSpeed”(位于基“vehicle”中)1>f:projectscppcppmain.cpp(30): error C2385: 對(duì)“Weight”的訪問(wèn)不明確1> 可能是“Weight”(位于基“vehicle”中)1> 也可能是“Weight”(位于基“vehicle”中)1>f:proj

20、ectscppcppmain.cpp(42): error C2385: 對(duì)“Run”的訪問(wèn)不明確1> 可能是“Run”(位于基“vehicle”中)1> 也可能是“Run”(位于基“vehicle”中)1>f:projectscppcppmain.cpp(42): error C3861: “Run”: 找不到標(biāo)識(shí)符1>f:projectscppcppmain.cpp(45): error C2385: 對(duì)“Stop”的訪問(wèn)不明確1> 可能是“Stop”(位于基“vehicle”中)1> 也可能是“Stop”(位于基“vehicle”中)1>f:pr

21、ojectscppcppmain.cpp(45): error C3861: “Stop”: 找不到標(biāo)識(shí)符1>1>生成失敗。1>1>已用時(shí)間 00:00:01.07= 生成: 成功 0 個(gè),失敗 1 個(gè),最新 0 個(gè),跳過(guò) 0 個(gè) =(2) 指明繼承路徑(程序及運(yùn)行結(jié)果)將vehicle中數(shù)據(jù)成員和函數(shù)成員指明路徑。/lab7_3.cpp#include <iostream>using namespace std;class vehicle/車(chē)類,作為基類protected:int MaxSpeed,Weight;/最大速度,重量public:void Ru

22、n() cout<<"車(chē)vehicle類開(kāi)始運(yùn)行!"<<endl; void Stop() cout<<"車(chē)vehicle類停止運(yùn)行!"<<endl; ;class bicycle:public vehicle/自行車(chē)類:公有繼承虛基類vehicleprotected:int Height;/高度;class motorcar:public vehicle/汽車(chē)類:公有繼承虛基類vehicleprotected:int SeatNum;/座位數(shù);class motorcycle:public bicycle

23、,public motorcar/摩托車(chē)類:公有繼承自行車(chē)類和汽車(chē)類public:void Setdatabicycle(int ms,int wt,int ht,int sn)bicycle:MaxSpeed=ms; bicycle:Weight=wt;/修改,指明路徑Height=ht; SeatNum=sn;void Showbicycle()cout<<"最大速度:"<<bicycle:MaxSpeed<<" 重量:"<<bicycle:Weight<<" 高度:"&

24、lt;<Height<<" 座位數(shù):"<<SeatNum<<endl; /修改,指明路徑;void main()cout<<"int類型占用字節(jié)數(shù): "<<sizeof(int)<<endl;cout<<"vehicle占用字節(jié)數(shù): "<<sizeof(vehicle)<<endl;cout<<"bicycle占用字節(jié)數(shù): "<<sizeof(bicycle)<<en

25、dl;cout<<"motorcar占用字節(jié)數(shù): "<<sizeof(motorcar)<<endl;cout<<"motorcycle占用字節(jié)數(shù): "<<sizeof(motorcycle)<<endl;motorcycle mt;mt.bicycle:Run();/修改,指明路徑mt.Setdatabicycle(100,200,130,2);mt.Showbicycle();mt.motorcar:Stop();/修改,指明路徑6. 以實(shí)驗(yàn)6中的people(人員)類為基類,派

26、生相應(yīng)的類。按任務(wù)7_4的要求編寫(xiě)程序,并運(yùn)行。參考的運(yùn)行結(jié)果: 程序及運(yùn)行結(jié)果:(1) lab6_7.h:People(人員)類的聲明及成員函數(shù)的實(shí)現(xiàn)/lab6_7.h#include <iostream>#include <cstring>using namespace 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 r

27、eturn mm; int Getdd()const return dd; void Setyy(int y) yy=y; void Setmm(int m) mm=m; void Setdd(int d) dd=d; ;class Peopleprivate:char name11;/姓名,增添char number7;/編號(hào),改為數(shù)組char sex3;/男或女,改為數(shù)組Date birthday;/出生日期char id16;/身份證號(hào),改為數(shù)組public:People()People(People &p);People()void Getname(char na) strcp

28、y(na,name); void Getnumber(char nu) strcpy(nu,number); void Getsex(char se)strcpy(se,sex); int Getbirthyy()const return birthday.Getyy(); int Getbirthmm()const return birthday.Getmm(); int Getbirthdd()const return birthday.Getdd(); void Getid(char d) strcpy(d,id); void Setname(char na) strcpy(name,n

29、a); void Setnumber(char nu) strcpy(number,nu); 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 input();void output();People:People(People &p):bi

30、rthday(p.birthday)strcpy(name,);strcpy(number,p.number);strcpy(sex,p.sex);strcpy(id,p.id);inline void People:input()cout<<"姓名:"cin>>name;cout<<"編號(hào):"cin>>number;cout<<"性別(男/女):"cin>>sex;cout<<"出生日期(年 月 日):"int y,m

31、,d; cin>>y>>m>>d;Setbirthyy(y); Setbirthmm(m); Setbirthdd(d);cout<<"身份證號(hào):"cin>>id;inline void People:output()cout<<"姓名:"<<name<<"n編號(hào):"<<number<<endl;cout<<"性別:"<<sex<<endl;cout<&l

32、t;"出生日期:"<<Getbirthyy()<<"年"<<Getbirthmm()<<"月"<<Getbirthdd()<<"日"<<endl;cout<<"身份證號(hào):"<<id<<endl;(2) lab7_4.h:People類的派生類/lab7_4.h#include "lab6_7.h"class student:virtual public Pe

33、ople/學(xué)生類private:char classNo7;/班號(hào)public:student()student(student &st):People(st) strcpy(classNo,st.classNo); /使用類型兼容規(guī)則student()void GetclassNo(char cNo) strcpy(cNo,classNo); void SetclassNo(char *c) strcpy(classNo,c); void input() People:input(); cout<<"班號(hào):" cin>>classNo; v

34、oid output() People:output(); cout<<"班號(hào):"<<classNo<<endl; ;class teacher:virtual public People/教師類private:char principalship11;/職務(wù)char department21;/部門(mén)public:teacher()teacher(teacher &t):People(t)strcpy(principalship,t.principalship);strcpy(department,t.department);te

35、acher()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 input()People:input();cout<<"職務(wù):" cin>>

36、;principalship;cout<<"部門(mén):" cin>> department;void output()People:output();cout<<"職務(wù):"<<principalship<<endl;cout<<"部門(mén):"<<department<<endl;class graduate:public student/研究生類private:char subject21;/專業(yè)teacher adviser;/導(dǎo)師public:

37、graduate()graduate(graduate &g):student(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);char se3; adviser.Gets

38、ex(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 na11; ad.Getname(na); adviser.Setname(na);char nb7; ad.Getnumber(nb); adviser.Setnumber(nb);char se3; a

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論