繼承與派生類習題_第1頁
繼承與派生類習題_第2頁
繼承與派生類習題_第3頁
繼承與派生類習題_第4頁
繼承與派生類習題_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、第九章繼承與派生類92 典型例題分析與解答例題1:下列對派生類的描述中,(     )是錯誤的。A  一個派生類可以作為另一個派生類的基類B  派生類至少有一個基類C  派生類的成員除了它自己的成員外,還包含了它的基類成員D 派生類中繼承的基類成員的訪問權限到派生類保持不變答案:D分析:一個派生類可以作為另一個派生類的基類。無論是單繼承還是多繼承,派生類至少有一個基類。派生類的成員除了它自己的成員外,還包含了它的基類成員。派生類中繼承的基類成員的訪問權限到派生類受繼承方式影響

2、的,對于私有繼承,基類的public,protected成員在派生類中作為private成員;對于公有繼承,基類的public,protected成員在派生類中訪問屬性不變;對于保護繼承,基類的public、protected成員在派生類中作為protected成員。例題2:派生類的對象對它的哪一類基類成員是可以訪問的?(     )   A公有繼承的基類的公有成員            

3、0;  B. 公有繼承的基類的保護成員   C. 公有繼承的基類的私有成員               D. 保護繼承的基類的公有成員答案:A分析:公有繼承的基類的公有成員在派生類中保持公有訪問權限,所以派生類對象可以訪問它;公有繼承的基類的保護成員在派生類中保持保護訪問權限,所以派生類對象不可以訪問它;基類的私有成員不能被派生到派生類中,所以派生類對象不可以訪問它;保護繼承的基類的公有成員在派生

4、類中變成保護的訪問權限,所以派生類對象不可以訪問它。 例題3:關于多繼承二義性的描述,(     )是錯誤的。A 派生類的多個基類中存在同名成員時,派生類對這個成員訪問可能出現(xiàn)二義性B  一個派生類是從具有共同的間接基類的兩個基類派生來的,派生類對該公共基類的訪問可能出現(xiàn)二義性C  解決二義性最常用的方法是作用域運算符對成員進行限定D  派生類和它的基類中出現(xiàn)同名函數時,將可能出現(xiàn)二義性答案:D分析:出現(xiàn)二義性有兩種情況:調用不同基類的相同成員時可能出現(xiàn)二義性;訪問

5、共同基類的成員時可能出現(xiàn)二義性。消除二義性的方法是采用作用域運算符。派生類和它的基類中出現(xiàn)同名函數時,不可能出現(xiàn)二義性。 例題4:多繼承派生類構造函數構造對象時,(     )被最先調用。A派生類自己的構造函數       B虛基類的構造函數C非虛基類的構造函數          D派生類中子對象類的構造函數答案:分析:多繼承派生類構造函數構造對象時,構造函數的調順序

6、是:虛基類的構造函數,派生類中子對象類的構造函數, 派生類自己的構造函數。 例題5: C+類體系中,能被派生類繼承的是(     )。A構造函數    B虛函數  C析構函數     D友元函數答案:分析:C+類體系中,構造函數、析構函數和友元函數是不能被派生類繼承的 例題6:設有基類定義:class Cbase   private: int a; 

7、0;  protected: int b;    public: int c;派生類采用何種繼承方式可以使成員變量b成為自己的私有成員(     )A. 私有繼承             B.保護繼承C. 公有繼承          

8、60;  D.私有、保護、公有均可答案:分析:私有繼承時,基類的protected成員在派生類中作為private成員。 例題7:C+將類繼承分為      ()      和     ()       兩種。答案:()單繼承()多繼承分析:派生類可以只從一個基類中派生,也可以從多個基類中派生。從一個基類中派生的繼承方式稱為單繼

9、承。從多個基類中派生的繼承方式稱為多繼承。 例題8:派生類可以定義其_中不具備的數據和操作。答案:基類分析:派生類是從基類派生的,派生類包含了它所有基類的除構造函數、析構函數之外的所有成員,同時還擁有它自己的新成員。 例題9:派生類構造函數的初始化列表中包含_。答案:初始化基類數據成員、新增內嵌對象數據及新增一般成員數據所需要的全部參數。 例題10:在繼承機制下,當對象消亡時,編譯系統(tǒng)先執(zhí)行  (1)   的析構函數,然后才執(zhí)行   (2)  的析構函數,最后執(zhí)行&

10、#160;  (3)   的析構函數。答案:(1)派生類(2)派生類中子對象類(3)基類分析:派生類的析構函數的執(zhí)行次序與構造函數正好相反,先調用派生類的析構函數,再調用派生類中子對象類的析構函數,最后調用基類的析構函數。 例題11:設有以下類的定義:class A               class B: protected A    

11、60;   class C: private B  int  A1;               int b1;                  int c1;protected: 

12、60;int A2;       protected: int b2;         protected: int c2;public:   int A3;         public: int b3;         

13、60; public: int c3;                                           請按訪問權限寫出派生類C中具有的成員

14、。私有成員:             (1)                          保護成員:        

15、0;    (2)                           公有成員:             (3)    

16、;                      。答案:(1)c1、b2、b3、A2、A3    (2)c2    (3)c3分析:類有它自己的私有成員b1、保護成員b2和公有成員有b3,另外類是以保護方式從類中派生出來的,所以類保護成員2和公有成員A3在類中都變成保護類型的;類有自己的私有成員c1、

17、保護成員c2和公有成員有c3,類是以私有方式從B類中派生出來的,所以類中的b2、b3、A2和A3在類中都變成私有的訪問方式。 例題12:指出并改正下面程序中的錯誤。#include<iostream.h>class Point   int x,y; public:    Point(int a=0,int b=0) x=a; y=b;    void move(int xoffset,int yoffset) x+=xoffset; y+=yoffset

18、;    int getx() return x;    int gety() return y;class Rectangle:protected Point    int length,width;  public:     Rectangle(int x,int y,int l,int w):Point(x,y)       

19、60; length=l;width=w;     int getlength()return length;     int getwidth()return width;void main() Rectangle r(0,0,8,4); r.move(23,56);cout<<r.getx()<<","<<r.gety()<<","<<r.getlength()<&l

20、t;","<<r.getwidth()<<endl;分析:保護繼承方式使基類的public成員在派生類中的訪問屬性變?yōu)閜rotected,所以派生類Rectangle的對象r不能直接訪問基類的成員函數move()、getx()和gety()。其改正方法有兩種:1)將Rectangle的繼承方式改為公有繼承public;2)在Rectangle類中重定義move(),getx()和gety()函數,覆蓋基類的同名函數。void Rectangle:move(int xoffset,int yoffset)Point:move(xoffset,yoffs

21、et);void Rectangle:getx()return Point:getx();void Rectangle:gety()return Point:gety(); 例題13:指出并改正下面程序中的錯誤。#include<iostream.h>class A public:    int x;    A(int a=0) x=a;    void display() cout<<"A.x="<<x<

22、;<endl; ;class B public:     int x;     B(int a=0) x=a; void display() cout<<"B.x="<<x<<endl; ;class C:public A,public B   int y; public:    C(int a,int b,int c) :A(a),B(b)&#

23、160;        y=c;      int gety() return y; ;void main() C myc(1,2,3); myc.x=10; myc.display();分析:類A、B中有同名公有數據成員x和同名成員函數display(),在主函數中訪問對象myc的數據成員x是無法確定是訪問從A中繼承的還是從B中繼承的x;調用成員函數也是如此,無法確認是調用類A中的還是類B中的,產生二義性。改正方法,可以用作用域區(qū)分符

24、加以限定,如改成myc.A:x=10; myc.A:display();或myc.B:x=10; myc.B:display(); 例題14:看程序寫結果#include <iostream.h>class Base     int i;   public:      Base(int n)cout <<"Constucting base class" << endl;i=n; &

25、#160;    Base()cout <<"Destructing base class" << endl;      void showi()cout << i<< ","      int Geti()return i;   class Derived:public Base   &#

26、160; int j;      Base aa;   public:      Derived(int n,int m,int p):Base(m),aa(p)       cout << "Constructing derived class" <<endl;     &

27、#160; j=n;            Derived()cout <<"Destructing derived class"<<endl;      void show()Base:showi();          cout << j<&l

28、t;"," << aa.Geti() << endl;    void main() Derived obj(8,13,24); obj.show(); 說明:派生類的構造函數的執(zhí)行次序,先調用基類的構造函數,再調用派生類中子對象類的構造函數,最后調用派生類的構造函數。析構函數的執(zhí)行次序與構造函數正好相反,先調用派生類的析構函數,再調用派生類中子對象類的析構函數,最后調用基類的析構函數。運行結果:Constucting base classConstucting base classCons

29、tructing derived class13,8,24Destructing derived classDestructing base classDestructing base class  93 教材習題分析與解答1選擇題(1)C+中的類有兩種用法:一種是類的實例化,即生成類對象,并參與系統(tǒng)的運行;另一種是通過()派生了新的類。   A.復用          B.繼承     

30、0;  C.封裝      D.引用答案:B(2)繼承具有(     ),即當基類本身也是某一個類派生類時,底層的派生類也會自動繼承間接基類的成員。    A)規(guī)律性        B.傳遞性       C.重復性    D.多樣性答案:

31、B(3)下列對基類和派生類關系的描述中,錯誤的是(    )。A.派生類是基類的具體化     B.派生類是基類的子集C.派生類是基類定義的延續(xù)   D.派生類是基類的組合答案:B(4)下列對派生類的描述中,錯誤的是(   )。A.   一個派生類可以作為另一個派生類的基類B.   派生類至少有一個基類C.   派生類的缺省繼承方式是privateD.

32、60;  派生類只含有基類的公有成員和保護成員答案:D(5)下列對繼承的描述中,錯誤的是(    )。A.   析構函數不能被繼承B.   派生類也是基類的組合C.   派生類的成員除了它自己的成員外,還包含了它的基類的成員D.   派生類中繼承的基類成員的訪問權限到派生類保持不變答案:D(6)派生類的對象對它的基類成員中(   )是可以訪問的。   

33、60;    A.公有繼承的公有成員       B.公有繼承的私有成員        C.公有繼承的保護成員       D.私有繼承的公有成員答案:A(7)下列說法錯誤的是(     )。A.        

34、;公有繼承的基類中的public成員在派生類中仍是public的B.        公有繼承的基類中的private成員在派生類中仍是private的C.        私有繼承的基類中的public成員在派生類中變成private的D.        保護繼承的基類中的public成員在派生類中變成protected的答案:B (8)下面敘述錯誤

35、的是( A  )。A.        基類的protected成員在派生類中仍然是protectedB.        基類的protected成員在public派生類中仍然是protected的C.        基類的protected成員在private派生類中是private的D.    &

36、#160;   D.  基類的protected成員不能被派生類的對象訪問答案:A(9)C+類體系中,不能被派生類繼承的有(   )。A.構造函數    B.虛函數  C.靜態(tài)成員函數     D.賦值操作函數答案:A(10)設置虛函數的聲明中,正確的是(    )。A.簡化程序    B.消除二義性  C.提高運行效

37、率   D.減少目標代碼答案:B(11)下列虛基類的聲明中,正確的是( D )。A.class virtual B:public A    B.virtual class B:public AC.class B:public A virtual    D.class B: virtual public A答案:D(12)在下面的表達式中,不表示虛繼承的是(   )。A.virtual public    B.publ

38、ic virtual  C.public   D. virtual答案:C2.  比較類的三種繼承方式public(公有繼承)、protected(保護繼承)、private(私有繼承)之間的差別。答:繼承方式決定了基類中的成員在派生類中的屬性。三種繼承方式的共同點:基類的private成員在派生類中不可見。區(qū)別:對于私有繼承,基類的public,protected成員在派生類中作為private成員;對于公有繼承,基類的public,protected成員在派生類中訪問屬性不變;對于保護繼承,基類的public,prote

39、cted成員在派生類中作為protected成員。3. 派生類構造函數執(zhí)行的次序是怎樣的?答:派生類構造函數的執(zhí)行順序是先執(zhí)行所有基類的構造函數(順序按照定義派生類是指定的各基類順序),再執(zhí)行對象成員所在類的構造函數(順序按照他們在類中的聲明順序),最后執(zhí)行派生類構造函數體中的內容。4. 如果在派生類B已經重載了基類A的一個成員函數fn1(),沒有重載成員函數fn2(),如何調用基類的成員函數fn1(),fn2()?答:因為在派生類B已經重載了基類A的一個成員函數fn1(),所以要用作用域運算符對fn1()函數加以限定,調用基類的成員函數fn1()是A:fn1();因為在派生類B沒有重載成員函

40、數fn2(),所以直接可調用fn2()。5. 什么叫做虛基類?它有何作用?答:在多重繼承中,如果多條繼承路徑上有一個公共的基類,則在這些路徑的匯合點上的派生類會產生來自不同路徑的公共基類的多個拷貝,如果用virtual把公共基類定義成虛基類,則只會保留公共基類的一個拷貝。引進虛基類的目的是為了解決二義性問題,使得公共基類在它的派生類對象中只產生一個基類子對象。6. 聲明一個Shape基類,在此基礎上派生出Rectangle和Circle類,二者都有GetArea()函數計算對象的面積。使用Rectangle類創(chuàng)建一個派生類Square。#include<iostream.h>#de

41、fine PI 3.1415926class shapeprotected:    double s;public:    void show()   cout<<"s= "<<s<<endl;    class Rectangle:public shape      double x,y;   

42、60;public:       Rectangle(double x1=0,double y1=0)      x=x1;y=y1;       void  GetArea()         s=x*y;     class Circl

43、e:public shape      double r;     public:        Circle(double r1=0)         r=r1;         void  GetArea(

44、)         s=r*r*PI;    class Square   :public Rectangle      double a;    public:       Square(double a1=0 )  a=a1;  

45、60;    void  GetArea()         s=a*a;      8定義一個基類有姓名、性別、年齡,再由基類派生出教師類和學生類,教師類增加工號、職稱和工資,學生類增加學號、班級、專業(yè)和入學成績。#include<iostream.h>#include<string.h>#include<iomanip.h>class base &

46、#160;       /定義一個基類protected:   char  name20;    /姓名   char sex3;        /性別   int age;          

47、60; /年齡    class teacher:public base     /基類派生出教師類  int sno;            /工號   char zc20;         /職稱   do

48、uble wages;          /工資   class student :public base     /基類派生出學生類  int sno;        /學號   char bj10;    /班級   

49、;char zy10;    /專業(yè)   double score;   /入學成績     94      補充習題選擇題(2) 設有如下程序:#include<iostream.h>class A  public:    int i;      

50、;display() cout<<”class An”; ;class Bpublic:   int i;    display() cout<<”class Bn”; ;class C: public: A,public B    int j;public:     int i; show()j=i*i; display();void main()C demo; demo.show();主程序運行時將(     )A.      因變量i的重復定義而報錯B.      因對象demo間接調用display函數時產生歧義性而報錯C.      因類定義的語法錯而不能運行D. 

溫馨提示

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

評論

0/150

提交評論