继承与派生类习题_第1页
继承与派生类习题_第2页
继承与派生类习题_第3页
继承与派生类习题_第4页
继承与派生类习题_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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 派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性B  一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的访问可能出现二义性C  解决二义性最常用的方法是作用域运算符对成员进行限定D  派生类和它的基类中出现同名函数时,将可能出现二义性答案:D分析:出现二义性有两种情况:调用不同基类的相同成员时可能出现二义性;访问

5、共同基类的成员时可能出现二义性。消除二义性的方法是采用作用域运算符。派生类和它的基类中出现同名函数时,不可能出现二义性。 例题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:在继承机制下,当对象消亡时,编译系统先执行  (1)   的析构函数,然后才执行   (2)  的析构函数,最后执行&

10、#160;  (3)   的析构函数。答案:(1)派生类(2)派生类中子对象类(3)基类分析:派生类的析构函数的执行次序与构造函数正好相反,先调用派生类的析构函数,再调用派生类中子对象类的析构函数,最后调用基类的析构函数。 例题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成员在派生类中的访问属性变为protected,所以派生类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中的,产生二义性。改正方法,可以用作用域区分符

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(); 说明:派生类的构造函数的执行次序,先调用基类的构造函数,再调用派生类中子对象类的构造函数,最后调用派生类的构造函数。析构函数的执行次序与构造函数正好相反,先调用派生类的析构函数,再调用派生类中子对象类的析构函数,最后调用基类的析构函数。运行结果:Constucting base classConstucting base classCons

29、tructing derived class13,8,24Destructing derived classDestructing base classDestructing base class  93 教材习题分析与解答1选择题(1)C+中的类有两种用法:一种是类的实例化,即生成类对象,并参与系统的运行;另一种是通过()派生了新的类。   A.复用          B.继承     

30、0;  C.封装      D.引用答案:B(2)继承具有(     ),即当基类本身也是某一个类派生类时,底层的派生类也会自动继承间接基类的成员。    A)规律性        B.传递性       C.重复性    D.多样性答案:

31、B(3)下列对基类和派生类关系的描述中,错误的是(    )。A.派生类是基类的具体化     B.派生类是基类的子集C.派生类是基类定义的延续   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.静态成员函数     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成员在派生类中不可见。区别:对于私有继承,基类的public,protected成员在派生类中作为private成员;对于公有继承,基类的public,protected成员在派生类中访问属性不变;对于保护继承,基类的public,prote

39、cted成员在派生类中作为protected成员。3. 派生类构造函数执行的次序是怎样的?答:派生类构造函数的执行顺序是先执行所有基类的构造函数(顺序按照定义派生类是指定的各基类顺序),再执行对象成员所在类的构造函数(顺序按照他们在类中的声明顺序),最后执行派生类构造函数体中的内容。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类创建一个派生类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定义一个基类有姓名、性别、年龄,再由基类派生出教师类和学生类,教师类增加工号、职称和工资,学生类增加学号、班级、专业和入学成绩。#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;    /专业   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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论