[计算机类试卷]国家二级C++机试(继承和派生)模拟试卷5及答案与解析.doc

上传人:registerpick115 文档编号:497762 上传时间:2018-11-30 格式:DOC 页数:21 大小:54KB
下载 相关 举报
[计算机类试卷]国家二级C++机试(继承和派生)模拟试卷5及答案与解析.doc_第1页
第1页 / 共21页
[计算机类试卷]国家二级C++机试(继承和派生)模拟试卷5及答案与解析.doc_第2页
第2页 / 共21页
[计算机类试卷]国家二级C++机试(继承和派生)模拟试卷5及答案与解析.doc_第3页
第3页 / 共21页
[计算机类试卷]国家二级C++机试(继承和派生)模拟试卷5及答案与解析.doc_第4页
第4页 / 共21页
[计算机类试卷]国家二级C++机试(继承和派生)模拟试卷5及答案与解析.doc_第5页
第5页 / 共21页
点击查看更多>>
资源描述

1、国家二级 C+机试(继承和派生)模拟试卷 5及答案与解析 一、选择题 1 下列有关继承和派生的叙述中,正确的是 ( )。 ( A)如果一个派生类私有继承其基类,则该派生类对象不能访问基类的保护成员 ( B)派生类的成员函数可以访问基类的所有成员 ( C)基类对象可以赋值给派生类对象 ( D)如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类 2 在类声明中,紧跟在 “public; ”后声明的成员的访问权限是 ( )。 ( A)私有 ( B)公有 ( C)保护 ( D)默认 3 有 如下类定义: class XX int xdata; public: XX(int n=0): xda

2、ta(n) ; class YY: public XX int ydata; public: YY(int m=0, int n=0): XX(m), ydata(n) ; YY类的对象包含的数据成员的个数是 ( )。 ( A) 1 ( B) 2 ( C) 3 ( D) 4 4 下列关于基类和派生类关系的叙述中,正确的是 ( )。 ( A)每个类最多只能有一个直接基类 ( B)派生类中的成员可以访 问基类中的任何成员 ( C)基类的构造函数必须在派生类的构造函数体中调用 ( D)派生类除了继承基类的成员,还可以定义新的成员 5 当派生类继承一个基类时,默认的继承方式为 ( )。 ( A) Pu

3、blic ( B) protected ( C) private ( D)不确定 6 有如下程序: #include iostream using namespace std; class Base public: void fun()cout “Base: fun“ endl; ; class Derived: public Base public: void fun() _ cout “Derived: fun“ endl; ; int main() Derived d; d fun(); return 0; 已知其执行后的输出结果为: Base: fun Derived: fun 则程序

4、中下划线处应填入的语句是 ( )。 ( A) Base fun(); ( B) Base: fun(); ( C) Base- fun(); ( D) fun(); 7 有如下类定义: class MyBase int k; public: MyBase(int n=0): k(n) int value()constreturn k; ; class MyDerived: MyBase int j; public: MyDerived(int i): j(i) int getK()constreturn k; int getJ()constreturn j; ; 编译时发现有一处语法错误,对这

5、个错误最准确的描述是 ( )。 ( A)函数 getK试图访问基类的私有成员变量 k ( B)在类 MyDerived的定义中,基类名 MyBase前缺少关键字 public、 protected或 pfivate ( C)类 MyDerived少一个无参的构造函数 ( D)类 MyDerived的构造函数没有对基类数据成员 k进行初始化 8 有如下类声明: class Base protected; int amount; public; Base(int n=0): amount(n) int getAmount()constreturn amount; ; class Derived:

6、public Base protected; int value; public; Derived(int m, int n): value(m) Base(n) Int getData()constreturn value+amount; ; 己知 x是一个 Derived对象,则下列表达式中正确的是 ( )。 ( A) x value+x getAmount() ( B) x getData()-x gctAmount() ( C) X getData()-x amount ( D) x value+x amount 9 建立一个有成员对象的派生类对象时,各构造函数体的执行次序为 ( )。

7、 ( A)派生类、成员对象类、基类 ( B)成员对象类、基类、派生类 ( C)基类、成员对象类、派生类 ( D)基类、派生类、成员对象类 10 有如下程序: #include iostream using namespace std; class AA int k; protected: int n; void setK(int k)this- k=k; public: void setN(int n)this- n=n; ; class BB: public AA *类体略 * ; int main() BB x; x n=1; 1 x setN(2); 2 x k=3; 3 x setK(

8、4); 4 return 0; 在标注号码的四条语句中正确的是 ( )。 ( A) 1 ( B) 2 ( C) 3 ( D) 4 11 当派生类从一个基类保护继承时,基类中的一些成员在派生类中成为保护成员,这些成员在基类中原有的访问属性是 ( )。 ( A) 任何 ( B)公有或保护 ( C)保护或私有 ( D)私有 12 有如下程序: class Base public: int data; ; class Derived1: public Base; class Derived2: protected Base; int main() Derived1 d1; Derived2 d2; d

9、1 data=0: d2 data=0; return 0; 下列关于程序编译结果的描述中,正确的是 ( )。 ( A) 皆无编译错误 ( B) 有编泽错误, 无编译错误 ( C) 无编译错误, 有编译错误 ( D) 皆有编译错误 13 有如下程序: #include iostream using namespace std; class A public: A()cout =“A“; ; classBpublic: B()cout “B“; classC: public A B b; public: C()cout “C“; ; int main()C obj; return 0; 执行后的

10、输出结果是 ( )。 ( A) CBA ( B) BAC ( C) ACB ( D) ABC 14 在一个派生类对象结束其生命周期时 ( )。 ( A)先调用派生类的析构函数后调用基类的析构函数 ( B)先调用基类的析构函数后调用派生类的析构函数 ( C)如果基类没有定义析构函数,则只调用派生类的析构函数 ( D)如果派生类没有定义析构函数,则只调用基类的析构函数 15 有如下程序: #include iostream using namespace std; class A public: A(int i)x=i; void dispa()cout x , ; private: int x:

11、 ; class B: public A public: B(int i): A(i+10)x=i; void dispb()dispa(); cout x endl; private int x; ; int main() B b(2); b dispb(); return 0; 运行时输出的结果是 ( )。 ( A) 10 2 ( B) 12, 10 ( C) 12, 2 ( D) 2, 2 16 有如下程序: include iostrearn using namespace std; class C1 public: C1()cout 1; ; class C2: public C1

12、public: C2()cout 2; ; int main() C2 cb2; C1 *cb1; return 0; 运行时的输出结果是 ( )。 ( A) 121 ( B) 21 ( C) 211 ( D) 12 17 有如下类定义: class AA int a; public: AA(int 11=0): a(n) ; class BB: public AA Public: BB(int n)_ ; 其中横线处缺失部分是 ( )。 ( A): a(n) ( B): AA(n) ( C) a(n); ( D) a=n; 18 有如下程序: #include iostream using

13、namespace std; class A public: A()cout A; A()cout C; ; class B: public A public: B()cout G; B()cout T; ; int main() B obj; return 0; 运行这个程序的输出结果是 ( )。 ( A) GATC ( B) AGTC ( C) GACT ( D) AGCT 19 有如下程序: #include iostream using narnespace std; class Mountain int height; public: Mountain(int h=0): heigh

14、t(h) virtual char* GetName() constreturn“山 “; int GetHeight() constreturn height; ; class Lushan: public Mountain Publie: Lushan(int d): Mountain(d) Char * GetName() constreturn“庐山 “; ; int main() Mountain *p=new Lushan(1000); cout p- GetName() “海拔 “ p- GetHeight() “米 “; return 0; 运行这个程序的输出结果是 ( )。

15、( A)庐山海拔 1000米 ( B)庐山海拔 0米 ( C)山海拔 1000米 ( D)山海拔 0米 20 有如下程序: #include iostream using namespace std; class Base public: void fun1()cout “Base n“, virtual void fun2()cout “Base n“; ; class Derived: public Base public: void fun1()cout “Derived n“; void fun2()cout “Derived n“; ; void f(Base& b)b fun1()

16、; b fun2(); int main() Derived obj f(obj); return 0: 执行这个程序的输出结果是 ( )。 ( A) Base Base ( B) Base Derived ( C) Derived Base ( D) Derived Derived 21 虚函数支持多态调用,一个基类的指针可以指向派生类的对象,而且通过这样的指针调用虚函数时,被调用的是指针所指的实际对象的虚函数。而非虚函数不支持多态调用。有如下程序: #include iostream using namespace std; class Base public: virtual void

17、f()cout “f0+“; void g()cout “g0+“; ; class Derived: public Base public: void f()cout “f+“; void gocout, “g+“; ; int main Derived d; Base *p=&d; p- f(); p- g(); return 0: 运行时输出的结果是 ( )。 ( A) f+g+ ( B) f0+g+ ( C) f+g0+ ( D) f0+g0+ 22 下列有关抽象类和纯虚函数的叙述中,错误的是 ( )。 ( A)拥有纯虚函数的类是抽象类,不能用来定义对象 ( B)抽象类的派生类若不实现

18、纯虚函数,它也是抽象类 ( C) 纯虚函数的声明以 “=0; ”结束 ( D)纯虚函数都不能有函数体 23 在一个抽象类中,一定包含有 ( )。 ( A)虚函数 ( B)纯虚函数 ( C)模板函数 ( D)重载函数 24 下面是类 shape的定义: class Shape public: Virtual void Draw()=0; ; 下列关于 Shape类的描述中,正确的是 ( )。 ( A)类 Shape是虚基类 ( B)类 Shape是抽象类 ( C)类 Shape中的 Draw函数声明有误 ( D)语句 “Shape s; ”能 够建立 Shape的一个对象 s 25 有如下程序:

19、 #include iostream using namespace std; class Book public: Book(char*t=“)strcpy(title , t); private: char title40; ; class Novel: public Book public: Novel(char*t=“): Book(t) char*Category()constreturn“文学 “; ; int main() Book*pb; pb=new Novel(); cout pb- Category(); return 0; 若程序运行时输出结果是 “文学 ”,则划线处缺

20、失的语句是 ( )。 ( A) char* Category(); ( B) char* Category()const; ( C) virtual char* Category()const; ( D) virtual char* Category()const=0; 26 有如下类定义 class Animal public: virtual void Name0=0; ; class Koala: public Animal public: void Name() *函数体略 * ; 关于上述类定义,下列描述中错误的是 ( )。 ( A)类 Koala是类 Animal的派生类 ( B)

21、类 Koala中的 Name函数是一个虚函数 ( C)类 Animal中的 Name函数是一个纯虚函数 ( D)语句 “Animal a; ”能够建立类 Animal的一个对象 a 国家二级 C+机试(继承和派生)模拟试卷 5答案与解析 一、选择题 1 【正 确答案】 D 【试题解析】 止 b题考查的是继承和派生。无论是哪种继承方式,派生类都能够访问基类的公有和保护成员,而不能访问基类的私有成员,故选项 A和 B错误;公有继承时,基类的对象不可作为派生类的对象处理,即基类对象不可赋值给派生类对象,所以选项 C错误。 【知识模块】 继承和派生 2 【正确答案】 B 【试题解析】 类中提供了 3种

22、访问控制的权限:公有。私有和保护。其中公有类型定义了类的外部接口,任何一个外部的访问都必须通过外部接口进行。私有类型的成员只允许本类的成员函数访问,来自类外部的 任何访问都是非法的,保护类型介于公有类型和私有类型之间,在继承和派生时可以体现出其特点。 【知识模块】 继承和派生 3 【正确答案】 B 【试题解析】 因为类 XX包括一个数据成员 xdata,而类 YY继承自类 XX,所在类 YY中也包含数据成员 xdata,同时类 YY中也定义了其本身的数据成员ydata,因而 YY类的对象包含的数据成员的个数是 2。 【知识模块】 继承和派生 4 【正确答案】 D 【试题解析】 继承分为单继承和

23、多继承,一个类只有一个直接基类时,称为单继承:而一个类同时有 多个直接基类时,则称为多继承。派生类的数据成员由所有基类的的数据成员与派生类新增的数据成员共同组成。 【知识模块】 继承和派生 5 【正确答案】 C 【试题解析】 派生类继承一个基类时,默认的继承方式为 private。 【知识模块】 继承和派生 6 【正确答案】 B 【试题解析】 此题考查的是继承的使用。分析题目可知,横线处应填入对基类成员函数 fun()的调用语句,此处只能使用作用域运算符 “: ”才能调用到基类的同名函数,故选项 B正确。 【知识模块】 继承和派生 7 【正确答案】 A 【试题解析】 此题考查的是派生类对基类成

24、员的访问。因为类中缺省的访问权限是私有,所以本题中 MyBase类中定义的成员 k是私有成员。派生类中的成员只能访问基类中的公有成员和保护成员,不能访问基类中的私有成员。所以派生类中函数 getK()中的语句 return k;是非法的。 【知识模块】 继承和派生 8 【正确答案】 B 【试题解析】 此题考查的是派生类对基类成员的访问权限。派生类中的成员不能访问基类中的私有成员,可以访问基类中的公有成员和保护成员。派生类从基类公有继承 时,基类的公有成员和保护成员在派生类中仍然是公有成员和保护成员;派生类从基类私有继承时,基类的公有成员和保护成员在派生类中都变成私有成员;派生类从基类保护继承时

25、,基类的公有成员在派生类中变成保护成员,基类的保护成员在派生类中仍然是保护成员。 【知识模块】 继承和派生 9 【正确答案】 C 【试题解析】 建立派生类对象的时候,构造函数的执行顺序如下:执行基类的构造函数,调用的顺序按照基类被继承时候的顺序 (自左向右 )。然后是执行成员对象的构造函数,调用顺序按照各个成员对象在类中的声明顺序 (自上而 下 ),最后是执行派生类的构造函数。 【知识模块】 继承和派生 10 【正确答案】 B 【试题解析】 因为类 BB公有继承自类 AA,所以 AA中的保护成员和公有成员在类 BB中仍是保护成员和公有成员。在选项 B中调用了公有成员函数 setN(int n)

26、this- n=n; ,对保护成员 n进行赋值操作。 【知识模块】 继承和派生 11 【正确答案】 B 【试题解析】 基类的公有成员和保护成员只有在以保护继承方式继承时,其在继承类中是保护成员。 【知识模块】 继承和派生 12 【正确答案】 C 【试题解析】 保护继承的类 Dervied2不能访问基类 Base中的公共数据成员data。 【知识模块】 继承和派生 13 【正确答案】 D 【试题解析】 此题考查的是类的继承和派生。系统首先要通过派生类的构造函数调用基类的构造函数,对基类成员初始化;然后对派生类中的新增成员初始化。 【知识模块】 继承和派生 14 【正确答案】 A 【试题解析】 此

27、题考查的是派生类对象的析构。释放派生类对象时,析构函数的执行顺序是:首先调用派生类自身的析构函数;然后调用 类成员对象的析构函数;最后调用基类的析构函数。所以四个选项中只有选项 A正确。 【知识模块】 继承和派生 15 【正确答案】 C 【试题解析】 此题考查的是派生类的构造。主函数中,首先声明 B类的对象 b,执行进入 B的构造函数 B(int i)再接着执行 A的构造函数 A(int i)。形参 i为 12, x被赋值 12;通过对象 b调用其成员函数 dispb(),输出结果 12;接着执行函数dispb()的第 2条语句输出 2,然后主函数结束。 【知识模块】 继承和派生 16 【正确

28、答案】 B 【试题解 析】 在主函数中定义 C2类的对象,当程序结束时,首先调用 C2类的析构函数 C2,输出 2,再调用 C1类的析构函数 C1,输出 1。所以程序运行的结果就是 21。 【知识模块】 继承和派生 17 【正确答案】 B 【试题解析】 根据派生类构造函数的一般格式:派生类名 (总参数表 ):基类名 1 (参数表 1 ), 基类名 n (参数表 n ),成员对象名 1(参数表 n+1 ), 成员对象名 m (参数表 n+m )派生类构造函数体。在派生类 BB的构造函数总参数表后面应该接上基类名 AA和其 参数。 【知识模块】 继承和派生 18 【正确答案】 B 【试题解析】 派

29、生类 B是由基类 A公开继承而来,所以在创建类 B的 obj对象时,首先执行基类 A的构造函数 A(),输出 A,再执行派生类 B的构造函数 B(),输出 G,当程序结束时,首先执行派生类的析构函数 B(),输出 T,再执行基类A的析构函数 A(),输出 C。 【知识模块】 继承和派生 19 【正确答案】 A 【试题解析】 在基类 Mountain中定义了虚函数 GotName()输出字符串 “山 ”,而在派生类 Lushan中对虚函数 GetName()进行了重新定义,输出字符串 “庐山 ”。在主函数中对派生类中的虚函数 GetName()进行了多态调用,此时调用的是派生类中重新定义的 Ge

30、tName(),输出字符字符串 “庐山 ”。 【知识模块】 继承和派生 20 【正确答案】 B 【试题解析】 此题考查的是虚函数的概念。在 C+语言中,一个派生类的对象可以被它的任何一个基类的指针所指向,若基类和派生类中存在一模一样的成员函数。那么通过该基类指针调用这样的成员函数时,若这个成员函数被定义成虚函数,那么就调用派生类中的:否则就调用基类 中的。本题中,在的函数中,形参 b是一个基类的引用,它引用的是主函数中定义的派生类对象 obj,所以在调用fun1()时,运行的是基类的版本,而 fun2()运行的是派生类的版本。 【知识模块】 继承和派生 21 【正确答案】 C 【试题解析】 此

31、题考查的是虚函数和多态性。此题中,因为 f()是虚函数具有多态性,所以通过指针 p调用的 fi()是派生类 Derived中定义的 f();而 g()不是虚函数,通过指针 p调用的是 Base中的 g( )。 【知识模块】 继承和派生 22 【正确答案】 D 【试题解析】 此题考查的是抽象类和纯虚函数的概念。纯虚函数可以有函数体,它的实现由派生类给出。 【知识模块】 继承和派生 23 【正确答案】 B 【试题解析】 拥有纯虚函数的类叫做抽象类,所以抽象类中必然包含有虚函数。 【知识模块】 继承和派生 24 【正确答案】 B 【试题解析】 因为类 Shape中包含纯虚函数 Draw(),所以类 Shape是抽象类。 【知识模块】 继承和派生 25 【正确答案】 D 【试题解析】 根据程序运行的结果为:文学,说明程 序执行了派生类 Novel中的成员函数 *Category()constreturn“文学 “; ),所以在基类 Book中要把函数*Category()const定义为纯虚函数。 【知识模块】 继承和派生 26 【正确答案】 D 【试题解析】 在类 Animal定义了纯虚函数 Name(),所以类 Animal就是一个抽象类,而抽象类是不能够建立对象的。 【知识模块】 继承和派生

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试资料 > 职业资格

copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1