C++實(shí)驗(yàn)報(bào)告(虛基類)分析_第1頁(yè)
C++實(shí)驗(yàn)報(bào)告(虛基類)分析_第2頁(yè)
C++實(shí)驗(yàn)報(bào)告(虛基類)分析_第3頁(yè)
C++實(shí)驗(yàn)報(bào)告(虛基類)分析_第4頁(yè)
C++實(shí)驗(yàn)報(bào)告(虛基類)分析_第5頁(yè)
已閱讀5頁(yè),還剩1頁(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、實(shí)驗(yàn)五 Shape虛基類一、實(shí)驗(yàn)?zāi)康?.掌握虛基類的定義、使用2.理解使用虛函數(shù)和繼承類實(shí)現(xiàn)多態(tài)性二、實(shí)驗(yàn)環(huán)境Windows + VC+6.0。三、實(shí)驗(yàn)內(nèi)容及要求定義抽象基類Shape,有它派生出三個(gè)類:Circle、Rectangle、Triangle,用函數(shù)ShowArea分別顯示各種圖形的面積,最后還要顯示所有的圖形面積。要求用基類指針數(shù)組,使他的每一個(gè)元素指向一個(gè)派生類對(duì)象。四、實(shí)驗(yàn)步驟(1) 定義一個(gè)虛基類Shape,在ShowArea函數(shù)聲明前冠以virtual使其成為虛函數(shù),并且能夠在派生類中重定義。/形狀類 Shapeclass Shape public: virtual do

2、uble ShowArea()const=0; ;(2)定義三個(gè)派生類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)用三個(gè)派生類的ShowArea函數(shù),求出各個(gè)形狀的面積。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)定義一個(gè)基類指針數(shù)組p3 =&A,&B,&C,通過(guò)->訪問(wèn)派生類對(duì)象的成員函數(shù)ShowArea,如p0->ShowArea()訪問(wèn)的是對(duì)象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. 抽象類只能作為基類來(lái)使用,其純虛函數(shù)的實(shí)現(xiàn)由派生類給出。如果派生類中沒(méi)有重新定義純虛函數(shù),而只是繼承基類的純虛函數(shù),則這個(gè)派生類仍然還是一個(gè)抽象類。如果派生類中給出了基類純虛函數(shù)的實(shí)現(xiàn),則該派生類就不再是抽象類了,它是一個(gè)可以建立對(duì)象的具體的類。抽象類是不能定義對(duì)象的。如下例:class Shape public: virtual double ShowArea()const=0; ;2. 如果派生類重寫(xiě)了基類的虛函數(shù),那么

7、編譯器對(duì)應(yīng)的操作為將指向虛函數(shù)表的指針_vfptr指向的函數(shù)指針數(shù)組中相應(yīng)的虛函數(shù)入口地址改變?yōu)楫?dāng)前派生類實(shí)現(xiàn)的函數(shù)入口地址; 基類指針指向派生類后,實(shí)際上指向的是從基類派生到派生類那段成員的首地址(存放_(tái)vfptr,如果定義有虛函數(shù)),基類指針在調(diào)用虛函數(shù)的額時(shí)候,是通過(guò)查該_vfptr地址指向的函數(shù)指針數(shù)組來(lái)查找函數(shù)入口地址。所以,如果派生類重寫(xiě)了虛函數(shù),那么以上查找的虛函數(shù)的入口地址將是派生類重寫(xiě)的函數(shù)的入口地址。pi->ShowArea();/訪問(wèn)派生類重寫(xiě)ShowArea函數(shù)的入口地址¡六、實(shí)驗(yàn)結(jié)果與總結(jié)實(shí)驗(yàn)總結(jié):抽象基類與普通基類不同,他平不是現(xiàn)實(shí)存在的對(duì)象,它可以

8、沒(méi)有任何物理上的或其他實(shí)際意義方面的含義,例如Shape類,只有一個(gè)成員函數(shù),沒(méi)有數(shù)據(jù)成員。它既不代表點(diǎn),也不代表圓。實(shí)驗(yàn)結(jié)果如下:實(shí)驗(yàn)總結(jié):1. 抽象基類與普通基類不同,他平不是現(xiàn)實(shí)存在的對(duì)象,它可以沒(méi)有任何物理上的或其他實(shí)際意義方面的含義,例如Shape類,只有一個(gè)成員函數(shù),沒(méi)有數(shù)據(jù)成員。它既不代表點(diǎn),也不代表圓。對(duì)于虛函數(shù),在基類用Virtual申明成員函數(shù)為虛函數(shù)。這樣就可以在派生類中重新定義此函數(shù),為他賦新功能,并能方便的調(diào)用。2. 抽象基類是本類族的公共接口?;蛘哒f(shuō),從同一基類派生出的多個(gè)類有同一接口。因此能響應(yīng)同一形式的消息(例如各類對(duì)象都有能對(duì)用基類指針調(diào)用虛函數(shù)作出響應(yīng)),但

9、是相應(yīng)的方式因?qū)ο蟛煌?。在通過(guò)虛函數(shù)實(shí)現(xiàn)動(dòng)態(tài)多動(dòng)性時(shí),可以不必考慮對(duì)象是哪一個(gè)類派生出來(lái)的,都用同一種方式調(diào)用(因?yàn)榛愔羔樋梢灾赶蛲活惤M的所有類,因而可通過(guò)基類指針調(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. 本站所有資源如無(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)論