C++語言程序設計實驗答案-繼承與派生(共15頁)_第1頁
C++語言程序設計實驗答案-繼承與派生(共15頁)_第2頁
C++語言程序設計實驗答案-繼承與派生(共15頁)_第3頁
C++語言程序設計實驗答案-繼承與派生(共15頁)_第4頁
C++語言程序設計實驗答案-繼承與派生(共15頁)_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

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

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

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

5、lCompile:1> main.cpp1>f:projectscppcppmain.cpp(13): 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 成員(在“Ani

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

7、rivate: /private時出錯/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時的結果:1>- 已啟動生成: 項目: cpp, 配置: Debug Win32 -1>生成啟動時間為 2013-2

8、-18 11:10:35。1>InitializeBuildStatus:1> 正在創(chuàng)建“Debugcpp.unsuccessfulbuild”,因為已指定“AlwaysCreate”。1>ClCompile:1> main.cpp1>f:projectscppcppmain.cpp(13): error C2248: “Animal:age”: 無法訪問 private 成員(在“Animal”類中聲明)1> f:projectscppcppmain.cpp(8) : 參見“Animal:age”的聲明1> f:projectscppcppmain.

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

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

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

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

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

14、torcycle:public bicycle,public motorcar/摩托車類:公有繼承自行車類和汽車類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();為什么?按推算應該是:vehicle占用8字節(jié);bicycle占用12字節(jié);motorcar占用12字節(jié);motorcycle占用16字節(jié)。5.(驗證)把vehicle設置為非虛基類。再編譯一次,此時系統(tǒng)報錯,無法編譯

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

18、uccessfulbuild”,因為已指定“AlwaysCreate”。1>ClCompile:1> main.cpp1>f:projectscppcppmain.cpp(27): error C2385: 對“MaxSpeed”的訪問不明確1> 可能是“MaxSpeed”(位于基“vehicle”中)1> 也可能是“MaxSpeed”(位于基“vehicle”中)1>f:projectscppcppmain.cpp(27): error C2385: 對“Weight”的訪問不明確1> 可能是“Weight”(位于基“vehicle”中)1>

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

20、ectscppcppmain.cpp(42): error C2385: 對“Run”的訪問不明確1> 可能是“Run”(位于基“vehicle”中)1> 也可能是“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:pr

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

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

23、,public motorcar/摩托車類:公有繼承自行車類和汽車類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. 以實驗6中的people(人員)類為基類,派

26、生相應的類。按任務7_4的要求編寫程序,并運行。參考的運行結果: 程序及運行結果:(1) lab6_7.h:People(人員)類的聲明及成員函數(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;/編號,改為數(shù)組char sex3;/男或女,改為數(shù)組Date birthday;/出生日期char id16;/身份證號,改為數(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<<"編號:"cin>>number;cout<<"性別(男/女):"cin>>sex;cout<<"出生日期(年 月 日):"int y,m

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

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

33、ople/學生類private:char classNo7;/班號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<<"班號:" cin>>classNo; v

34、oid output() People:output(); cout<<"班號:"<<classNo<<endl; ;class teacher:virtual public People/教師類private:char principalship11;/職務char department21;/部門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<<"職務:" cin>>

36、;principalship;cout<<"部門:" cin>> department;void output()People:output();cout<<"職務:"<<principalship<<endl;cout<<"部門:"<<department<<endl;class graduate:public student/研究生類private:char subject21;/專業(yè)teacher adviser;/導師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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論