




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、實驗五 Shape虛基類一、實驗?zāi)康?.掌握虛基類的定義、使用2.理解使用虛函數(shù)和繼承類實現(xiàn)多態(tài)性二、實驗環(huán)境Windows + VC+6.0。三、實驗內(nèi)容及要求定義抽象基類Shape,有它派生出三個類:Circle、Rectangle、Triangle,用函數(shù)ShowArea分別顯示各種圖形的面積,最后還要顯示所有的圖形面積。要求用基類指針數(shù)組,使他的每一個元素指向一個派生類對象。四、實驗步驟(1) 定義一個虛基類Shape,在ShowArea函數(shù)聲明前冠以virtual使其成為虛函數(shù),并且能夠在派生類中重定義。/形狀類 Shapeclass Shape public: virtual do
2、uble ShowArea()const=0; ;(2)定義三個派生類Circle、Rectangle、Triangle,并公有繼承Shape基類。/圓形 Circleclass Circle:public Shape private: double radius;/半徑 public: Circle(double r):radius(r) /構(gòu)造函數(shù) double ShowArea() const /求圓形面積的函數(shù) return PI*radius*radius; ;/矩形類 Rectangleclass Rectangle:public Shape private: double hei
3、gth;/高 double width;/寬public: Rectangle(double h,double w):heigth(h),width(w)/構(gòu)造函數(shù) double ShowArea()const /求矩形面積的函數(shù) return heigth*width; ;/三角形類 Triangleclass Triangle:public Shape private: double a,b,c;/三角形三條邊 public: Triangle(double x,double y,double z):a(x),b(y),c(z)/構(gòu)造函數(shù) double ShowArea()const /求
4、三角形面積函數(shù) int p=(a+b+c)/2;return sqrt(p*(p-a)*(p-b)*(p-c); (3)在主函數(shù)中分別調(diào)用三個派生類的ShowArea函數(shù),求出各個形狀的面積。int main() Circle A(0.5); cout<<"圓形面積y:"<<A.ShowArea()<<endl;/輸出圓形面積 cout<<endl;Rectangle B(3,4); cout<<"矩形面積y:"<<B.ShowArea()<<endl;/輸出矩形面積co
5、ut<<endl; Triangle C(5,3,4);cout<<"三角形面積y:"<<C.ShowArea()<<endl;/輸出三角形面積 (4)定義一個基類指針數(shù)組p3 =&A,&B,&C,通過->訪問派生類對象的成員函數(shù)ShowArea,如p0->ShowArea()訪問的是對象A的成員函數(shù)。double area=0.0; Shape *p3=&A,&B,&C;/基類指針數(shù)組 for(int i=0;i<3;i+) area=area+pi->
6、ShowArea();/面積相加 cout<<"總面積y:"<<area<<endl;/輸出總面積五、程序分析1. 抽象類只能作為基類來使用,其純虛函數(shù)的實現(xiàn)由派生類給出。如果派生類中沒有重新定義純虛函數(shù),而只是繼承基類的純虛函數(shù),則這個派生類仍然還是一個抽象類。如果派生類中給出了基類純虛函數(shù)的實現(xiàn),則該派生類就不再是抽象類了,它是一個可以建立對象的具體的類。抽象類是不能定義對象的。如下例:class Shape public: virtual double ShowArea()const=0; ;2. 如果派生類重寫了基類的虛函數(shù),那么
7、編譯器對應(yīng)的操作為將指向虛函數(shù)表的指針_vfptr指向的函數(shù)指針數(shù)組中相應(yīng)的虛函數(shù)入口地址改變?yōu)楫?dāng)前派生類實現(xiàn)的函數(shù)入口地址; 基類指針指向派生類后,實際上指向的是從基類派生到派生類那段成員的首地址(存放_vfptr,如果定義有虛函數(shù)),基類指針在調(diào)用虛函數(shù)的額時候,是通過查該_vfptr地址指向的函數(shù)指針數(shù)組來查找函數(shù)入口地址。所以,如果派生類重寫了虛函數(shù),那么以上查找的虛函數(shù)的入口地址將是派生類重寫的函數(shù)的入口地址。pi->ShowArea();/訪問派生類重寫ShowArea函數(shù)的入口地址¡六、實驗結(jié)果與總結(jié)實驗總結(jié):抽象基類與普通基類不同,他平不是現(xiàn)實存在的對象,它可以
8、沒有任何物理上的或其他實際意義方面的含義,例如Shape類,只有一個成員函數(shù),沒有數(shù)據(jù)成員。它既不代表點,也不代表圓。實驗結(jié)果如下:實驗總結(jié):1. 抽象基類與普通基類不同,他平不是現(xiàn)實存在的對象,它可以沒有任何物理上的或其他實際意義方面的含義,例如Shape類,只有一個成員函數(shù),沒有數(shù)據(jù)成員。它既不代表點,也不代表圓。對于虛函數(shù),在基類用Virtual申明成員函數(shù)為虛函數(shù)。這樣就可以在派生類中重新定義此函數(shù),為他賦新功能,并能方便的調(diào)用。2. 抽象基類是本類族的公共接口。或者說,從同一基類派生出的多個類有同一接口。因此能響應(yīng)同一形式的消息(例如各類對象都有能對用基類指針調(diào)用虛函數(shù)作出響應(yīng)),但
9、是相應(yīng)的方式因?qū)ο蟛煌?。在通過虛函數(shù)實現(xiàn)動態(tài)多動性時,可以不必考慮對象是哪一個類派生出來的,都用同一種方式調(diào)用(因為基類指針可以指向同一類組的所有類,因而可通過基類指針調(diào)用不同類的虛函數(shù))。附1:完整的原程序#include<iostream> #include<math.h>using namespace std; const double PI=3.1415926; /形狀類Shapeclass Shape public: virtual double ShowArea()const=0; ; /圓形類 Circleclass Circle:public Sha
10、pe private: double radius;/半徑 public: Circle(double r):radius(r) /構(gòu)造函數(shù) double ShowArea() const /求圓形面積函數(shù) return PI*radius*radius; ; /矩形類 Rectangleclass Rectangle:public Shape private: double heigth;/高 double width;/寬 public: Rectangle(double h,double w):heigth(h),width(w)/構(gòu)造函數(shù) double ShowArea()const
11、/求矩形面積函數(shù) return heigth*width; ; /三角形類Triangleclass Triangle:public Shape private: double a,b,c;/三角形三條邊 public: Triangle(double x,double y,double z):a(x),b(y),c(z)/構(gòu)造函數(shù) double ShowArea()const /求三角形面積函數(shù) int p=(a+b+c)/2;return sqrt(p*(p-a)*(p-b)*(p-c); ; int main() Circle A(0.5); cout<<"圓2形?面?積y:"<<A.ShowArea()<<endl;/輸出圓形面積 cout<<endl;Rectangle B(3,4); cout<<"矩形面積y:"<<B.ShowArea()<<endl;/輸出矩形面積cout<<endl; Triangle C(5,3,4);cout<<"三角形面積y:"<<C.ShowArea()<<endl;/輸出三角形面積 cout
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 被貓抓傷免責(zé)協(xié)議書
- 酒吧部門承包協(xié)議書
- 車輛內(nèi)部通信協(xié)議書
- 項目分包免責(zé)協(xié)議書
- 車間員工承包協(xié)議書
- 出租房裝修合同協(xié)議書
- 運營中心授權(quán)協(xié)議書
- 防疫卡口接車協(xié)議書
- 遼寧畢業(yè)三方協(xié)議書
- 車輛糾紛解決協(xié)議書
- 承包荒地治沙合同范例
- 心血管內(nèi)科降低患者橈動脈止血器壓迫不適發(fā)生率品管圈PDCA成果匯報書
- 第11課 近代職業(yè)教育的興起和發(fā)展
- 軟著設(shè)計說明書
- 第二單元《踐行職業(yè)道德》測試卷-高二思想政治課《職業(yè)道德與法治》附答案
- 三年合同到期不續(xù)簽勞動仲裁申請書
- 申請銀行減免利息的申請書
- 員工培訓(xùn)與開發(fā)
- 維修協(xié)議勞務(wù)合同
- 《長大以后做什么》繪本省公開課獲獎?wù)n件說課比賽一等獎?wù)n件
- 文明考風(fēng) 誠信考試
評論
0/150
提交評論