1、一 、 选 择 题1. C+语 言 建 立 类 族 是 通 过 _实 现 的 。 C A)类 的 嵌 套 B)虚 函 数 C)类 的 继 承 D)抽 象 类2. C+中 的 类 有 两 种 用 法 : 一 种 是 类 的 实 例 化 , 即 生 成 类 的 对 象 , 并 参 与 系 统 的 运 行 ; 另一 种 是 通 过 _派 生 出 新 的 类 。 B A)复 用 B)继 承 C)封 装 D)引 用3. 继 承 具 有 _, 即 当 基 类 本 身 也 是 某 一 个 类 的 派 生 类 时 , 底 层 的 派 生 类 也 会 自 动 继 承 间接 基 类 的 成 员 。 B A) 规
2、律 性 B)传 递 性 C) 重 复 性 D)多 样 性在 一 个 类 的 派 生 类 中 , 其 成 员 有 两 部 分 构 成 : 一 部 分 是 从 基 类 继 承 得 到 的 , 另 一 部 分是 自 己 定 义 的 新 成 员 。 当 基 类 本 身 也 是 一 个 派 生 类 时 , 它 必 然 包 含 了 它 的 直 接 基 类 的 成 员 ,这 些 成 员 相 应 地 也 存 在 于 该 基 类 的 派 生 类 中 。 因 此 , 继 承 是 具 有 传 递 性 的 。4. _ A_提 供 了 类 对 外 部 的 接 口 , _ B _是 类 的 内 部 实 现 , 而 _ D
3、 _不 允 许 外 界访 问 , 但 允 许 派 生 类 的 成 员 访 问 , 这 样 既 有 一 定 的 隐 藏 能 力 , 又 提 供 了 开 放 的 接 口 。A)公 有 成 员 B)私 有 成 员 C)私 有 成 员 函 数 D)保 护 成 员5. 下 列 对 基 类 和 派 生 类 关 系 的 描 述 中 , 错 误 的 是 _。 B A)派 生 类 是 基 类 的 具 体 化B)派 生 类 是 基 类 的 子 集C)派 生 类 是 基 类 定 义 的 延 续D)派 生 类 是 基 类 的 组 合派生类包含基类中的成员,它是对基类定义的扩充和延续,是对基类定义的进一步具体化,而不是
4、基类的子集。6 下 列 对 派 生 类 的 描 述 中 , 错 误 的 是 _。 D A)一 个 派 生 类 可 以 作 为 另 一 个 派 生 类 的 基 类B)派 生 类 至 少 有 一 个 基 类C)派 生 类 的 缺 省 继 承 方 式 是 privateD)派 生 类 只 继 承 了 基 类 的 公 有 成 员 和 保 护 成 员 /继 承 了 基 类 的 所 有 成 员7. 下 列 关 于 继 承 的 描 述 中 , 错 误 的 是 _。 D A)析 构 函 数 不 能 被 继 承B)派 生 类 是 基 类 的 组 合C)派 生 类 的 成 员 除 了 它 自 己 的 成 员 外
5、, 还 包 含 了 它 的 基 类 的 成 员D)派 生 类 中 继 承 的 基 类 成 员 的 访 问 权 限 到 派 生 类 保 持 不 变派 生 类 不 能 继 承 基 类 的 构 造 函 数 和 析 构 函 数 , 也 不 能 访 问 基 类 的 私 有 成 员 , 而 对 基 类的 公 有 成 员 和 保 护 成 员 的 访 问 权 限 随 着 派 生 类 对 基 类 的 继 承 方 式 而 改 变 。8. 派 生 可 以 分 为 _ A _和 _ C _。 由 _ _得 到 的 派 生 类 , 其 基 类 的 所 有 公 有 成 员 都只 能 成 为 它 的 私 有 成 员 , 这
6、 些 私 有 成 员 只 能 被 派 生 类 的 成 员 函 数 访 问 , 而 _ B _无权 访 问 ; 由 _ _得 到 的 派 生 类 , 其 基 类 中 所 有 公 有 成 员 在 派 生 类 中 也 都 是 公 有 的 。A)公 有 派 生 B)派 生 类 的 实 例C)私 有 派 生 D)派 生 类 的 构 造 函 数对于公有继承方式:基类成员对其对象的可见性 与一般类及其对象的可见性相同,公有成员可见,其他成员不可见。这里保护成员与私 有成员相同。基类成员对派生类的可见性 对派生类来说,基类的公有成员和保护成员可见:基类的公有成员和保护成员作为派生类的成员时,它们都保持原有的状
7、态;基类的私有成员不可见:基类的私有成员仍然是私有的,派生类不可访问基类中的私有成员。基类成员对派生类对象的可见性 对派生类对象来说,基类的公有成员是可见的, 其他成员是不可见。所以,在公有继承时,派生类的对象可以访问基类中的公有成员;派生类的成员函数可以访问基类中的公有成员和保护成员。对于私有继承方式:基类成员对其对象的可见性 与一般类及其对象的可见性相同,公有成员可见,其 他成员不可见。基类成员对派生类的可见性 对派生类来说,基类的公有成员和保护成员是可见的:基类的公有成员和保护成员都作为派生类的私有成员,并且不能被这个派生类的子类所访问;基类的私有成员是不可见的:派生类不可访问基类中的私
8、有成员。基类成员对派生类对象的可见性 对派生类对象来说,基类的所有成员都是不可见的。所以,在私有继承时,基类的成员只能由直接派生类访问,而无法再往下继承。 对于保护继承方式:这种继承方式与私有继承方式的情况相同。两者的区别仅在于对派生类的成员而言,基类成员对其对象的可见性 与一般类及其对象的可见性相同,公有成员可见,其 他成员不可见。基类成员对派生类的可见性 对派生类来说,基类的公有成员和保护成员是可见的:基类的公有成员和保护成员都作为派生类的保护成员,并且不能被这个派生类的子类所访问;基类的私有成员是不可见的:派生类不可访问基类中的私有成员。基类成员对派生类对象的可见性 对派生类对象来说,基
9、类的所有成员都是不可见的。所以,在保护继承时,基类的成员也只能由直接派生类访问,而无法再往下继承。 9. 基 类 的 _ B _不 能 为 派 生 类 的 成 员 访 问 , 基 类 的 _ A _在 派 生 类 中 的 性质 和 继 承 的 性 质 一 样 , 基 类 的 _ D_在 私 有 继 承 时 在 派 生 类 中 成 为 私 有 成员 函 数 , 在 公 有 和 保 护 继 承 时 在 派 生 类 中 仍 为 保 护 成 员 函 数 。A)公 有 成 员 B)私 有 成 员 C)私 有 成 员 函 数 D)保 护 成 员 函 数10. 派 生 类 的 对 象 对 它 的 基 类 成
10、 员 中 _A_是 可 以 访 问 的 。A)公 有 继 承 的 公 有 成 员 B)公 有 继 承 的 私 有 成 员C)公 有 继 承 的 保 护 成 员 D)私 有 继 承 的 公 有 成 员11. 下 列 说 法 中 错 误 的 是 _。 B A)公 有 继 承 时 基 类 中 的 public 成 员 在 派 生 类 中 仍 是 public 的B)公 有 继 承 时 基 类 中 的 private 成 员 在 派 生 类 中 仍 是 private 可 见 的C)私 有 继 承 时 基 类 中 的 public 成 员 在 派 生 类 中 是 private 的D)保 护 继 承
11、时 基 类 中 的 public 成 员 在 派 生 类 中 是 protected 的基类的私有成员在在派生类中是隐藏的,是不可见的,派生类不可访问基类中的私有成员。12. 下 面 叙 述 错 误 的 是 _: A A)基 类 的 protected 成 员 在 派 生 类 中 仍 然 是 protected 的B)基 类 的 protected 成 员 在 public 派 生 类 中 仍 然 是 protected 的C)基 类 的 protected 成 员 在 private 派 生 类 中 是 private 的D)基类的 protected 成员不能被派生类的对象访问参考第八题说
12、明14. C+类体系中,不能被派生类继承的有_。A A)构造函数 B)虚函数 C)静态成员函数 D)赋值操作函数派生类不能继承基类的构造函数和析构函数15. 派生类的构造函数的成员初始化列表中,不能包含_。C A)基类的构造函数B)派生类中子对象的初始化C)基类中子对象的初始化D)派生类中一般数据成员的初始化派生类的构造函数只负责对基类成员(调用基类的构造函数) 、新定义的子对象成员和一般数据成员进行初始化16 多继承的构造顺序可分为如下 4 步:C 所有非虚基类的构造函数按照它们被继承的顺序构造;所有虚基类的构造函数按照它们被继承的顺序构造;所有子对象的构造函数按照它们声明的顺序构造:派生类
13、自己的构造函数体:这 4 个步骤的正确顺序是_。A) B) c) D)参考课本 P387 及例题17 关于多继承二义性的描述中,错误的是_。C A) 一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访可能出现二义性B)解决二义性的最常用的方法是对成员名的限定法C)基类和派生类中同时出现的同名函数,也存在二义性问题D)一个派生类是从两个基类派生出来的,而这两个基类又有一个共同的基类对该基类成员进行访问时,可能出现二义性基类和派生类中同时出现的同名函数,若其形参个数、类型都一致则基类的被派生类的覆盖,否则可看作函数重载。18 设置虚基类的目的是_。B A)简化程序B)消除二义性C)提
14、高运行效率D)减少目标代码19. 下列虚基类的声明中,正确的是_。D A) class virtua1 B:public AB) virtual class B:public AC) class B:public A virtualD) c1ass B:virtual public A20. 带有虚基类的多层派生类构造函数的成员初始化列表中都要列出虚基类的构造函数,这样将对虚基类的子对象初始化_。D A)与虚基类下面的派生类个数有关 B)多次 C)两次 D)一次24. 下面_的叙述不符合赋值兼容规则。B A)派生类的对象可以赋值给基类的对象B)基类的对象可以赋值给派生类的对象C)派生类的对象可
15、以初始化基类的引用D)派生类的对象的地址可以赋值给指向基类的指针赋值兼容规则是指在需要基类对象的任何地方都可以使用公有派生类的对象来替代。通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员,而且所有成员的访问控制属性也和基类完全相同。这样,公有派生类实际就具备了基类的所有功能,凡是基类能解决的问题,公有派生类都可以解决。赋值兼容规则中所指的替代包括以下的情况:派生类的对象可以赋值给基类对象。派生类的对象可以初始化基类的引用。派生类对象的地址可以赋给指向基类的指针。在替代之后,派生类对象就可以作为基类的对象使用,但只能使用从基类继承的成员。参考光盘讲义第 13 章第 10 节26
16、. 下列程序巾,划线处正确的语句是_:C #include class Basepublic:void fun() coutfun();程序中要求显式调用某个类的成员时,必须使用成员名限定符(域区分符) 。其一般格式为 类名. 或 类名.()27. 下列程序中,编译时不会出错的语句是_A #include class Basepublic:Base() Base(int i) data=i; private:int data;class Derived: public Basepublic:Derived() :Base(0) Derived(int x): Base(x) ;void mai
17、n()Derived d1(1);Base *pb,b1;pb= /Ad1=b1; /BBase Derived d2=*pb; /CDerived /D公有继承时:派生类的对象可以赋值给基类的对象,即用派生类从基类继承来的成员,逐个赋值给基类对象的成员。反之则出错。派生类的对象可以初始化基类的引用。反之则出错。派生类的对象地址可以赋值给指向基类的指针。反之则出错。不用虚函数时,后两种情况的基类的指针和引用只能访问派生类中从基类继承来的成员二、填空题28 派生类对基类的继承有三种方式:_公有继承 public _、_私有继承 private _和_保护继承 protected _。29 类继承
18、中,缺省的继承方式是 private_。30 如果类 Alpha 继承了类 Beta,则类 Alpha 称为派生类类,类 Beta 称为_基类_类。31 C+提供的_多继承_机制允许一个派生类继承多个基类,即使这些基类是相互无关的。32 利用继承能够实现_软件复用。这种实现缩短了程序的开发时间,促使开发人员复用已经测试和调试好的高质量软件。33 若类 Y 是类 X 的私有派生类,类 Z 是类 Y 的派生类,则类 Z_不能_访问类 X 的保护成员与公有成员。34 当用 protected 继承从基类派生一个类时,基类的 public 成员成为派生类的protected成员,protected 成
19、员成为派生类的_protected_成员。35 多继承情况下,派生类的构造函数的执行顺序取决于_定义_派生类时所指定的各基类的顺序。36 构造函数_不能_被继承,析构函数_不能_被继承。37 对于派生类的构造函数,在定义对象时构造函数的执行顺序为:先执行_基类的构造函数_,再执行_子对象的构造函数_,最后执行_派生类本身的构造函数体_。38 对基类数据成员的初始化必须在派生类构造函数中的_成员初始化列表_处执行。在派生类构造函数中,对基类数据成员的初始化必须在成员初始化列表中进行,新增成员的初始化既可以在成员初始化列表中进行,也可以构造函数体中进行。39 当撤消一个含有基类和子对象成员的派生类
20、对象时,将首先完成_派生类_的析构函数定义体的执行,接着完成 _子对象的_的析构函数定义体的执行,最后完成_基类_的析构函数定义体的执行。派生类的析构函数的执行过程与派生类的构造函数的执行过程严格相反。40 _多_继承情况下,派生类中对基类成员的访问会出现二义性。解决二义性的方法是_成员名限定法_和_虚基类_。41 在派生类中使用基类的成员,可以显式地使用_成员名限定符_来使用基类成员。43 设置虚基类的目的是_解决二义性问题_,可通过关键字 virtual _标识虚基类。44 指向基类的对象的指针变量也可以指向_的对象。派生类46 _派生类_类的对象可作为_基类_类的对象处理。47 在划线处
21、填上适当的语句,完成下列程序。#include#include class Pointpublic:Point(double a, double b, double c) _X=a;Y=b;Z=c; double Getx( ) return X; double Gety( ) return Y; double Getz() return Z; private:_double X _protected:_double Y, Z;_ ;class Line:_public _ Pointpublic:Line(double a,double b,double c,double d):point(
22、a,b,c)_K=d;void show()couta=7; /_正确_py2-a=7; /_错误_py3-a=7; /_错误_void Y3:f(YI* pyl,Y2* py2,Y3* py3)pyl-a=7; /_正确_py2-a=7; /_错误_py3-a=7; /_正确_void Z2:f(YI* pyl,Y2* py2,Y3* py3)pyl-a=7; /_正确_py2-a=7; /_错误_py3-a=7; /_错误_ 派生类 Y1 从基类 X 公有继承,基类 X 成员 a 在 Y1 中仍然是 public,所以 Y1 类型的指针py1 可以访问 a 成员。因此、正确。派生类 Y2
23、从基类 X 保护继承.,X 成员 a 在 Y2 中变为 protected,保护成员不能在类体外被访问,因此在普通函数 f 及 Y3 的成员 f 函数的函数体内,不能通过 Y2 类型的指针 py2访问 a 成员,和错误。派生类 Z2 从派生类 Y2 公有继承,基类成员 a 在 Z2 中变为保护成员,因此 a 成员可以在Z2 的类体内被直接访问,或通过 Z2 类体内的 Z2 类对象被访问,而不能通过类 Z2 的基类Y2 的对象进行访问,因此错误。派生类 Y3 从基类 X 私有继承,基类成员 a 在 Y3 中变为私有成员,只能在 Y3 的类体内进行访问,在 Y3 的成员函数 f 中,Y3 类型的指
24、针 py3 可以访问 a 成员,此时仍然是在类 Y3 的类体内,因此正确。但在普通函数 f 及 Z2 的成员 f 函数的函数体内,不能通过 py3 访问a 成员,因此和错误。49 根据基类的定义和测试程序,完成下面派生类的定义。class Pointpublic:Point(int i=0,int j=0) X=i, Y=j; void Move(int xOff, int yOff) X+=xOff; Y+=yOff; int GetX() return X; int GetY() return Y;private:int X,Y;class Rectangle: private Point
25、public:Rectangle(int x,int y,int w,int h)_:Point(x,y)_W=w; H=h;void Move(int xOff, int yOff) _Point:Move(xOff,yOff);_int GetX()_return Point:GetX( );_int GetY()_return Point:GetY( ); _int GetW()_return W;_int GetH()_return H;_private:int W,H;#include #include void main()Rectangle rect(1,2,3,4);rect.
26、Move(5,6);coutclass Apublic:void f( int i) coutiendl; void g( ) cout“g“endl; ;class B: Apublic:void h() cout“h“endl; _A:f _;void main() B d1;d1.f(6);_d1_.h( );参考上题注释。作业 5 答案:一,选择题:1 C 2 B 3 B 4 A B D 5 B 6D 7D 8 A C B 9 B A D 10 A 11 B 12 A 14 A 15 C 16 C 17 C 18 B 19 B 20 D 24 B 26 C 27 A二 , 填 空 题
27、:28 公有继承 public 私有继承 private 保护继承 protected 29 private 30 派生类 基类 31 多继承 32 软件复用33 不能34 protected protected 35 定义36 不能 不能 37 基类的构造函数 子对象的构造函数 派生类本身的构造函数体 38 成员初始化列表 39 派生类 子对象的 基类 40 多 成员名限定法 虚基类 41 成员名限定符 43 解决二义性问题 关键字 virtual 44 派生类46 派生类 基类 47 X=a;Y=b;Z=c; double X double Y, Z; public :point(a,b,c) K=d; 48 正确 错误 错误 正确 错误 正确 正确 错误 错误 49 :Point(x,y) W=w; H=h; Point:Move(xOff,yOff); return Point:GetX( ); return Point:GetY( ); return W; return H; 50 A:f d1