c+多態(tài)性與虛函數(shù)習(xí)題答案_第1頁
c+多態(tài)性與虛函數(shù)習(xí)題答案_第2頁
c+多態(tài)性與虛函數(shù)習(xí)題答案_第3頁
c+多態(tài)性與虛函數(shù)習(xí)題答案_第4頁
c+多態(tài)性與虛函數(shù)習(xí)題答案_第5頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、1 概念填空題1.1 C+支持兩種多態(tài)性,分別是 編譯時(shí) 和 運(yùn)行時(shí) 。1.2在編譯時(shí)就確定的函數(shù)調(diào)用稱為 靜態(tài)聯(lián)編 ,它通過使用 函數(shù)重載,模板等 實(shí)現(xiàn)。1.3在運(yùn)行時(shí)才確定的函數(shù)調(diào)用稱為 動態(tài)聯(lián)編 ,它通過 虛函數(shù) 來實(shí)現(xiàn)。1.4虛函數(shù)的聲明方法是在函數(shù)原型前加上關(guān)鍵字 virtual 。在基類中含有虛函數(shù),在派生類中的函數(shù)沒有顯式寫出virtual關(guān)鍵字,系統(tǒng)依據(jù)以下規(guī)則判斷派生類的這個(gè)函數(shù)是否是虛函數(shù):該函數(shù)是否和基類的虛函數(shù) 同名 ;是否與基類的虛函數(shù) 參數(shù)個(gè)數(shù)相同、類型 ;是否與基類的虛函數(shù) 相同返回類型 。如果滿足上述3個(gè)條件,派生類的函數(shù)就是 虛函數(shù)。并且該函數(shù) 覆蓋 基類的虛

2、函數(shù)。1.5當(dāng)通過 引用 或 指針 使用虛函數(shù)時(shí),C+會在與對象關(guān)聯(lián)的派生類中正確的選擇重定義的函數(shù)。實(shí)現(xiàn)了 運(yùn)行時(shí) 時(shí)多態(tài)。而通過 對象 使用虛函數(shù)時(shí),不能實(shí)現(xiàn)運(yùn)行時(shí)時(shí)多態(tài)。1.6 純虛函數(shù)是一種特別的虛函數(shù),它沒有函數(shù)的 函數(shù)體 部分,也沒有為函數(shù)的功能提供實(shí)現(xiàn)的代碼,它的實(shí)現(xiàn)版本必須由 派生類 給出,因此純虛函數(shù)不能是 友元函數(shù) 。擁有純虛函數(shù)的類就是 抽象類 類,這種類不能 實(shí)例化 。如果純虛函數(shù)沒有被重載,則派生類將繼承此純虛函數(shù),即該派生類也是 抽象 。1.7 類的構(gòu)造函數(shù) 不可以 (可以/不可以)是虛函數(shù),類的析構(gòu)函數(shù)可以 (可以/不可以)是虛函數(shù)。當(dāng)類中存在動態(tài)內(nèi)存分配時(shí)經(jīng)常將

3、類的 析構(gòu)函數(shù) 函數(shù)聲明成 虛函數(shù) 。2簡答題2.1在C+中,能否聲明虛構(gòu)造函數(shù)?為什么?能否聲明虛析構(gòu)函數(shù)?為什么?2.2 什么是抽象類?抽象類有何作用?可以聲明抽象類的對象嗎?為什么?2.3多態(tài)性和虛函數(shù)有何作用?2.4是否使用了虛函數(shù)就能實(shí)現(xiàn)運(yùn)行時(shí)的多態(tài)性?怎樣才能實(shí)現(xiàn)運(yùn)行時(shí)的多態(tài)性?2.5為什么析構(gòu)函數(shù)總是要求說明為虛函數(shù)?3選擇題3.1在C+中,要實(shí)現(xiàn)動態(tài)聯(lián)編,必須使用(D)調(diào)用虛函數(shù)。A.類名 B.派生類指針 C.對象名 D.基類指針3.2下列函數(shù)中,不能說明為虛函數(shù)的是(C)。A.私有成員函數(shù) B.公有成員函數(shù) C.構(gòu)造函數(shù) D.析構(gòu)函數(shù)3.3在派生類中,重載一個(gè)虛函數(shù)時(shí),要求函

4、數(shù)名、參數(shù)的個(gè)數(shù)、參數(shù)的類型、參數(shù)的順序和函數(shù)的返回值(A)。 A.相同 B.不同 C.相容 D.部分相同3.4當(dāng)一個(gè)類的某個(gè)函數(shù)被說明為virtual時(shí),該函數(shù)在該類的所有派生類中(A)。 A都是虛函數(shù) B只有被重新說明時(shí)才是虛函數(shù) C只有被重新說明為virtual時(shí)才是虛函數(shù) D都不是虛函數(shù)3.5( C)是一個(gè)在基類中說明的虛函數(shù),它在該基類中沒有定義,但要求任何派生類都必須定義自己的版本。 A虛析構(gòu)函數(shù)B虛構(gòu)造函數(shù) C純虛函數(shù)D靜態(tài)成員函數(shù)3.6 以下基類中的成員函數(shù),哪個(gè)表示純虛函數(shù)(C)。 Avirtual void vf(int);Bvoid vf(int)=0; Cvirtual

5、 void vf( )=0;Dvirtual void vf(int) 3.7下列描述中,(D)是抽象類的特性。 A可以說明虛函數(shù) B可以進(jìn)行構(gòu)造函數(shù)重載 C可以定義友元函數(shù) D不能定義其對象3.8類B是類A的公有派生類,類A和類B中都定義了虛函數(shù)func( ),p是一個(gè)指向類A對象的指針,則p-A:func( )將(A)。 A調(diào)用類A中的函數(shù)func( ) B調(diào)用類B中的函數(shù)func( ) C根據(jù)p所指的對象類型而確定調(diào)用類A中或類B中的函數(shù)func( ) D既調(diào)用類A中函數(shù),也調(diào)用類B中的函數(shù)3.9類定義如下。class Apublic:virtual void func1( ) void

6、 fun2( ) ;class B:public Apublic:void func1( ) cout”class B func1”endl;virtual void func2( ) cout”class B func2”endl;則下面正確的敘述是(A) AA:func2( )和B:func1( )都是虛函數(shù) BA:func2( )和B:func1( )都不是虛函數(shù) CB:func1( )是虛函數(shù),而A:func2( )不是虛函數(shù) DB:func1( )不是虛函數(shù),而A:func2( )是虛函數(shù)3.10下列關(guān)于虛函數(shù)的說明中,正確的是( B)。 A從虛基類繼承的函數(shù)都是虛函數(shù) B虛函數(shù)不得

7、是靜態(tài)成員函數(shù) C只能通過指針或引用調(diào)用虛函數(shù) D抽象類中的成員函數(shù)都是虛函數(shù)4寫出下列程序運(yùn)行結(jié)果4.1#includeusing namespace std;class A public:virtual void func( ) cout”func in class A”endl;class Bpublic:virtual void func( ) cout”func in class B”endl;class C:public A,public Bpublic:void func( ) cout”func in class C”endl:;int main( )C c;A& pa=c;B

8、& pb=c;C& pc=c;pa.func( ); pb.func( );pc.func( );func in class C func in class C func in class C4.2#includeusing namespace std;class Apublic:virtual A( )cout”A:A( ) called “endl; ;class B:public Achar *buf;public:B(int i) buf=new chari; virtual B( )delete buf;cout”B:B( ) called”endl;void fun(A *a) d

9、elete a;int main( )A *a=new B(10);fun(a);B:B( ) calledA:A( ) called5.程序設(shè)計(jì)題5.1有一個(gè)交通工具類vehicle,將它作為基類派生小車類car、卡車類truck和輪船類boat,定義這些類并定義一個(gè)虛函數(shù)用來顯示各類信息。#include#includeusing namespace std;class Vehiclepublic:virtual void showinfo()=0;protected: char Name20;class Car:public Vehiclepublic:Car(char *name)st

10、rcpy(Name,name);void showinfo()coutNameendl;protected:int Radius;class Truck:public Vehiclepublic:Truck(char *name)strcpy(Name,name);void showinfo()coutNameendl;class Boat:public Vehiclepublic:Boat(char *name)strcpy(Name,name);void showinfo()coutNameshowinfo ();vp=&truck;vp-showinfo ();vp=&boat;vp-s

11、howinfo ();return 0;5.2定義一個(gè)shape抽象類,派生出Rectangle類和Circle類,計(jì)算各派生類對象的面積Area( )。#include#includeusing namespace std;class Shapepublic:virtual void Area()=0;class Rectangle:public Shapepublic:Rectangle(double w,double h)width=w,height=h;void Area()coutwidth*heightendl;protected:double width,height;class

12、 Circle:public Shapepublic:Circle(double r)radius=r;void Area()cout3.1415*radius*radiusArea ();sp=&cir1;sp-Area ();return 0;5.3定義貓科動物Animal類,由其派生出貓類(Cat)和豹類(Leopard),二者都包含虛函數(shù) sound( ),要求根據(jù)派生類對象的不同調(diào)用各自重載后的成員函數(shù)。#include#includeusing namespace std;class Animalpublic:virtual void Speak()=0;class Cat :pu

13、blic Animalvoid Speak()coutMy name is Catendl;class Leopard:public Animalvoid Speak()coutMy name is LeopardSpeak();Leopard leopard;pa=&leopard;pa-Speak();return 0;5.4矩形法(rectangle)積分近似計(jì)算公式為: x(y0+y1+.yn-1) 梯形法(1adder)積分近似計(jì)算公式為: y0+2(y1+.yn-1)+yn 辛普生法(simpson)積分近似計(jì)算公式(n為偶數(shù))為:y0+ yn +4(y1+y3.yn-1)+2(y

14、2+y4+yn-2)被積函數(shù)用派生類引入,定義為純虛函數(shù)。基類(integer)成員數(shù)據(jù)包括積分上下限b和a,分區(qū)數(shù)n,步長step=(b-a)n,積分值result。定義積分函數(shù)integerate()為虛函數(shù),它只顯示提示信息。派生的矩形法類(rectangle)重定義integerate(),采用矩形法做積分運(yùn)算。 派生的梯形法類(1adder)和辛普生法(simpson)類似。試編程,用3種方法對下列被積函數(shù)進(jìn)行定積分計(jì)算,并比較積分精度。 (1)sin(x),下限為0.0,上限為pir/2。 (2)exp(x),下限為0.0,上限為1.0。 (3)4.0/(1+xx),下限為0.0,

15、上限為1.0。解法一#include#includeusing namespace std;class Integerprotected:double result,a,b,step;/Intevalue積分值,a積分下限,b積分上限int n;public:virtual double fun(double x)=0;/被積函數(shù)聲明為純虛函數(shù)virtual void Integerate()cout這里是積分函數(shù)endl;Integer(double ra=0,double rb=0,int nn=2000)a=ra;b=rb;n=nn;result=0;void Print()cout.p

16、recision(15);cout積分值=resultendl;class Rectangle:public Integerpublic:void Integerate()int i;step=(b-a)/n;for(i=0;i=n;i+) result+=fun(a+step*i);result*=step;Rectangle(double ra,double rb,int nn):Integer(ra,rb,nn);class Ladder:public Integerpublic:void Integerate()int i;step=(b-a)/n;result=fun(a)+fun(

17、b);for(i=1;in;i+) result+=2*fun(a+step*i);result*=step/2;Ladder(double ra,double rb,int nn):Integer(ra,rb,nn);class Simpson:public Integerpublic:void Integerate()int i;step=(b-a)/n;result=fun(a)+fun(b);for(i=1;in;i+=2) result+=4*fun(a+step*i);for(i=2;iIntegerate();/動態(tài),可以訪問派生類定義的被積函數(shù)bp-Print();sinL s

18、l(0.0,3./2.0,100);bp=&sl;bp-Integerate();/動態(tài),可以訪問派生類定義的被積函數(shù)bp-Print();sinS ss(0.0,3./2.0,100);bp=&ss;bp-Integerate();/動態(tài),在層次中選bp-Print();expR er(0.0,1.0,100);bp=&er;bp-Integerate();/動態(tài),可以訪問派生類定義的被積函數(shù)bp-Print();expL el(0.0,1.0,100);bp=⪙bp-Integerate();/動態(tài),可以訪問派生類定義的被積函數(shù)bp-Print();expS es(0.0,1.0,1

19、00);bp=&es;bp-Integerate();/動態(tài),在層次中選bp-Print();otherR or(0.0,1.0,100);bp=∨bp-Integerate();/動態(tài),可以訪問派生類定義的被積函數(shù)bp-Print();otherL ol(0.0,1.0,100);/增加到也達(dá)不到辛普生法的精度bp=&ol;bp-Integerate();/動態(tài),可以訪問派生類定義的被積函數(shù)bp-Print();otherS os(0.0,1.0,100);bp=&os;bp-Integerate();/動態(tài),在層次中選bp-Print();return 0;解法二/Integer為抽

20、象類,fun為被積函數(shù),其余3個(gè)虛函數(shù)為積分函數(shù)#include#includeusing namespace std;class Integerprotected:double result,a,b,step;/Intevalue積分值,a積分下限,b積分上限int n;public:virtual double fun(double x)=0;/被積函數(shù)聲明為純虛函數(shù)virtual void Rectangle()=0;virtual void Ladder()=0;virtual void Simpson()=0;Integer(double ra=0,double rb=0,int n

21、n=2000)a=ra;b=rb;n=nn;step=(b-a)/n;result=0;void Print()cout.precision(15);cout積分值=resultendl;class SIN:public Integerpublic:SIN(double ra,double rb,int nn):Integer(ra,rb,nn)double fun(double x)return sin(x);void Rectangle()int i;for(i=0;i=n;i+) result+=fun(a+step*i);result*=step;void Ladder()int i;

22、result=fun(a)+fun(b);for(i=1;in;i+) result+=2*fun(a+step*i);result*=step/2;void Simpson()int i;result=fun(a)+fun(b);for(i=1;in;i+=2) result+=4*fun(a+step*i);for(i=2;iRectangle();Inp-Print();Inp-Ladder();Inp-Print();Inp-Simpson();Inp-Print();return 0;解法三/Integer為抽象類,fun為被積函數(shù),其余3個(gè)虛函數(shù)為積分函數(shù)#include#incl

23、udeusing namespace std;class Fun/被積函數(shù),抽象類public:virtual double fun(double x)=0;/被積函數(shù)聲明為純虛函數(shù);class Integer/積分函數(shù),抽象類protected:double result,a,b,step;/Intevalue積分值,a積分下限,b積分上限int n;public:virtual void Integrate()=0;Integer(double ra=0,double rb=0,int nn=2000)a=ra;b=rb;n=nn;step=(b-a)/n;result=0;void Print()cout.precision(15);cout積分值=resultendl;class SIN_Rect:public Integer,public Fun/求sin積分,采用矩形積分法public:SIN_Rect(double ra,double rb,int nn):Integer(ra,rb,nn)double fun(double x)return sin(x);void Integrate()int i;for(i=0;i=n;i+) result+=fun(a+step*i);result*=step;class

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論