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

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

1、国家二级 C+机试(继承和派生)模拟试卷 9及答案与解析 一、选择题 1 有如下类声明: class XA int x; public: XA(int n)x=n; ; class XB: public XA int y; public: XB(int a, int b); ; 在构造函数 XB的下列定义中,正确的是 ( )。 ( A) XB: XB(int a, int b): x(a), y(b) ( B) XB: XB(int a, int b): XA(a), y(b) ( C) XB: XB(int a, int b): x(a), XB(b) ( D) XB: XB(int a,

2、int b): XA(a), XB(b) 2 下列有关类继承的叙述中,错误的是 ( )。 ( A)继承可以实现软件复用 ( B)虚基类可以解决由多继承产生的二义性问题 ( C)派生类构造函数要负责调用基类的构造函数 ( D)派生类没有继承基类的私有成员 3 定义派生类时,若 不使用关键字显式地规定采用何种继承方式,则默认方式为( )。 ( A)私有继承 ( B)非私有继承 ( C)保护继承 ( D)公有继承 4 下列关于继承方式的描述中,错误的是 ( )。 ( A)如果不显式地指定继承方式,缺省的继承方式是私有 (private) ( B)采用公有继承方式时,基类中的公有成员在派生类中仍然是公

3、有成员 ( C)采用保护继承方式时,基类中的保护成员在派生类中仍然是保护成员 ( D)采用私有继承方式时,基类中的私有成员在派生类中仍然是私有成员 5 若已定义了类 Vehicle,则下列派生类定义中,错误的是 ( )。 ( A) class Car: vehicle *类体略 * ; ( B) class Car: public car *类体略 * ; ( C) class Car: public Vehicle *类体略 * ; ( D) class Car: virtual public Vehicle *类体略 * ; 6 下列关于派生类的叙述中,错误的是 ( )。 ( A)派生类至

4、少要有一个基类 ( B)派生类中包括了从基类继承的成员 ( C)一个派生类可以作为 另一个派生类的基类 ( D)基类成员被派生类继承以后访问权限保持不变 7 有如下程序: #include using namespace std; class Base private: void fun1 () constcout using namespace std; class XX int x; public: XX(intxx=0): x(xx) int getX()return x; ; class YY: public XX int y; public: YY(int xx, int yy):

5、XX(xx), y(yy) int getV()return getX()+y; ; int main() YY c(3, 4); cout using namespace std; classA public: A()cout using namespace std; class Base int x; public; Baseint n=0); x(n)cout using namespace std; class Base public: Base(int x=0): valB(x)cout using namespace std; class Basel public: Base1(i

6、nt d) cout using namespace std; class Base public: void fun()coutfun(); 20 在 C+中,用于实现运行时多态性的是 ( )。 ( A)内联函数 ( B)重载函数 ( C)模板函数 ( D)虚函数 21 有如下程序 #include using namespace std; class A public: virtual void func1()coutfunc1(); P-func2(); return 0: 运行此程序,屏幕上将显示输出 ( )。 ( A) B1B2 ( B) A1A2 ( C) B1A2 ( D) A1

7、B2 22 有如下程序; #include using namespace std; class Base public: void output()coutoutput(); ptr-Print(); delete ptr; return 0; 程序的输出结果是 ( )。 ( A) 1B ( B) 1D ( C) 2B ( D) 2D 23 有如下程序: #include using namespace std; class GA public; virtual int f()return 1; ; class GB: public GA public; virtual int f()ret

8、urn 2; ; void show(GA g)cout using namespace std; class A public: virtual void f()cout using namespace std; class B public: B(int xx): x(xx)+count; x+=10; ) virtual void show()const coutshow(); delete ptr; return 0; 运行时的输出结果是 ( )。 ( A) 1_120 ( B) 2_120 ( C) 1_20 ( D) 2_20 26 有如下程序: #include using na

9、mespace std; class Base public: virtual void function1() coutfunction1(); p-function2(); return 0; ; 运行时的输出结果是 ( )。 ( A) 01 ( B) 21 ( C) 03 ( D) 23 27 有如下程序: #include using namespace std; class B public: virtual void f()coutf(); P-g(); int main() D obj; h(&obj); return 0; 运行这个程序的输出结果是 ( )。 ( A) DD (

10、 B) BB ( C) BD ( D) DB 国家二级 C+机试(继承和派生)模拟试卷 9答案与解析 一、选择题 1 【正确答案】 B 【试题解析】 此题考查的是派生类中构造函数的定义。派生类的构造首先要调用基类的构造函数,对基类成员初始化;然后对派生类中的新增成员初始化。格式为:派生类名 (构造函数形参表 )基类构造函数 (形参 表 )。 【知识模块】 继承和派生 2 【正确答案】 D 【试题解析】 此题考查的是类继承。派生类继承了基类的 (全部数据成员,私有成员 ),只是基类的私有成员在派生类中是隐藏的,只能在基类内部访问,故选项D错误。 【知识模块】 继承和派生 3 【正确答案】 A 【

11、试题解析】 继承的方式包括三种:公有继承,保护继承和私有继承。如果不显示的给出继承方式,缺省的类继承方式是私有继承 private。 【知识模块】 继承和派生 4 【正确答案】 D 【试题解析】 基类中的私 有成员在派生类中是隐蔽的,只能在基类内部访问。派生类中的成员不可以访问基类中的私有成员,只可以访问基类中的公有成员和保护成员。 【知识模块】 继承和派生 5 【正确答案】 B 【试题解析】 类 Car不能派生自它奉身。 【知识模块】 继承和派生 6 【正确答案】 D 【试题解析】 派生类对象对基类成员的访问权限: 对于公有继承,只有基类的公有成员可以被派生类对象访问,其他 (保护和私有 )

12、成员不能被访问。 对于私有继承和保护继承,基类中所有成员都不能被派生类对象访问。派生类对基类成 员的访问权限: 对于公有继承,基类中公有成员和保护成员可以访问,而基类中私有成员不能被访问。 对于私有继承和保护继承,也是基类中的公有成员和保护成员可以被派生类访问,而基类中的私有成员不能被访问。 【知识模块】 继承和派生 7 【正确答案】 B 【试题解析】 此题考查的是保护继承。因为 Derived以 protected方式继承了Base类,所以父类 Base中的公有成员和保护成员均成了 Derived类的保护成员,而 Base类的私有成员 Derived类不可访问。所以,主函数中通过 Deriv

13、ed类 的对象只能够访问到 Derived类的公有成员。 【知识模块】 继承和派生 8 【正确答案】 C 【试题解析】 此题考查的是派生类对基类成员的访问。派生类对基类的各个成员的访问能力与继承方式无关,其成员不能访问基类中的私有成员,可以访问基类的公有成员和保护成员。 【知识模块】 继承和派生 9 【正确答案】 A 【试题解析】 在派生类对基类的三种继承形式中,都无法对基类的私有成员访问A正确。在 B中,三种继承方式都能访问基类的保护成员,故 B不正确。 C选项的情况在 f()是基类私有成员 情况下是对的,但是还有别的可能,并不一定正确。同样 D也不一定正确。 【知识模块】 继承和派生 10

14、 【正确答案】 A 【试题解析】 基类 Parents的私有成员 privateData在派生类 ChildA和 ChildB中是不可以访问,所以选项 B、 D是错误,而派生类 ChildB私有继承基类Parents,所以基类 Parents的公有成员 publicData在派生类 ChildB中变为私有成员,只能在派生类 ChildB内部访问,因而选项 C是错误的。派生类 ChildA公有继承基类 Parents,所以基 类 Parents的公有成员 publicData在派生类 ChildA中可以访问。 【知识模块】 继承和派生 11 【正确答案】 C 【试题解析】 在 C+中派生类从基类

15、保护继承时,基类的公有成员在派生类中改变为保护成员,基类的保护成员在派生类中仍为保护成员。所以对于本题来说,YY类保护继承自类 XX,那么类 XX中的公有成员 x3和保护成员 x2在派生类中都成为保护成员,再加上类 YY中的保护成员 y2,因此在派生类 YY中保护成员的个数为 3。 【知识模块】 继承和派生 12 【正确答案】 B 【试题解析】 派生类不论是采用那种继承方式继承基类,它的成员函数只能访问基类的公有成员和保护成员。 【知识模块】 继承和派生 13 【正确答案】 D 【试题解析】 由于类 YY公开继承自类 XX,所以执行表达式c getV()+e getX()的值等于 3+3+4=

16、10。 【知识模块】 继承和派生 14 【正确答案】 B 【试题解析】 此题考查的是派生类对象的构造与析构。建立派生类对象时,构造函数的执行顺序如下:执行基类的构造函数,调用顺序按照各个基类被定义时声明的顺序 (自左向 右 )-执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序 -执行派生类的构造函数。所以本题在建立派生类 B的对象 obj是会先调用基类 A的构造函数,然后调用自身的构造函数。注意: B类中定义的成员 p是 A类的指针而不是一个对象,故在调用自身构造函数前不需要构造。而在B类构造函数中使用 new操作符动态地构造了一个 A类的对象,所以整个构造结果是输出: ABA

17、。 派生类对象的析构与构造严格相反,即先析构自身,然后析构自身所包含的成员对象,最后调用基类的析构函数。故本题中当 main()函数返回时,析构 B类的对象 obj:首先调用 B(),接着再调用 A()因为在 B()函数中释放了动态创建的 A类对象,故整个析构所输出的结果足 B A A。所以这个程序输出结果为ABA B A A 【知识模块】 继承和派生 15 【正确答案】 D 【试题解析】 此题考查的是派生类的构造函数和析构函数。在撤销派生类对象时,析构函数的执行过程和构造函数严格相反,即:对派生类新增普通成员进行清理;调用成员对象析构函数,调用基类析构函数对基类进行清理。 【知识模块】 继承

18、和派生 16 【正确答案】 C 【试题 解析】 此题考查的是派生类的构造与析构。建立派生类的对象时,构造函数的执行顺序如下:执行基类的构造函数,调用顺序按照各个基类被继承时声明的顺序 (自左向右 )-执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序 -执行自身的构造函数。此题中,执行语句 Derived d1(3)首先调用基类的构造函数,输出 0;接着调用自身的构造函数输出 3。执行语句 Derived d2(5, 7)时,会调用基类的 Base(n)函数输出 7;然后执行继承类中的 Derived(int m, int n)的 y(m)输出 5。 【知识模块】 继承和派生 1

19、7 【正确答案】 A 【试题解析】 在主函数中创建类 Derived对象 obj12(2,3)时,因为类 Derived是从基类 Base派生而来,所以首先调用基类的构造函数,输出 2,再调用派生类构造函数,输出 3。当主函数运算结果时,首先调用派生类的析构函数,输出 3,再调用基类的析构函数输出 2。所以输出结果为 2332。 【知识模块】 继承和派生 18 【正确答案】 D 【试题解析】 程序在创建派生类对象 d时,分别调用基类 Base1和 Base1的构造函数。 【知识模块】 继承和派生 19 【正确答案】 C 【试题解析】 派生类 Derived的对象 d调用其成员函数 fum(),

20、要输出结果为BD,所以在其成员函数 fun()中要调用基类 Base的成员函数 fun()。 【知识模块】 继承和派生 20 【正确答案】 D 【试题解析】 此题考查的是虚函数的概念。 C+语言的多态性有两种:函数重载和虚函数。虚函数只有在运行时才能被确定,称为运行时多态。编译时的多态是通过函数重载和模板实现的。 【知识模块】 继承和派生 21 【正确答案】 C 【试题解析】 此题考查的是虚函数的概念。此题中, func1是虚函数, func2是一般成员函数,而且在派生类与基类中都存在两个这样的函数。在主函数中,语句 A*p=new B;定义了一个基类的指针 p,并让它指向一个派生类对象。所以

21、通过该指针调用 func1时,运行的是派生类的版本,而通过该指针调用 func2运行的是基类的版本。所以程序运行的最后输出是: B1A2。 【知识模块】 继承和派生 22 【正确答案】 B 【试题解析】 此题考查的是虚函数与多态性。在成员函数的声明前面加上 virual关键字,即可把函数声明为虚函数;在 C+中,一个基类指针可以用于指向它的派生类对象,而且通过这样的指针调用虚函数时,被调用的是该指针实际所指向的对象类的那个重定义版本。本题中,从基类的定义可以看出: output()函数是普通成员函数,而 Print()函数是虚函数。所以,通过 ptr指针调用的 output()是基类中的 ou

22、tput(),而通过它调用的 Print()则是派生类中的: Print()。 【知识模块】 继承和派生 23 【正确答案】 C 【试题解析】 此题考查派生类与虚函数的考查。由主 函数 main入手,其中分别定义了类 GA和 GB的对象 a和 b。首先,执行参数 a的 show函数调用,其中的输出语句为调用 GA类中的 f()虚函数,返回 1。同理 display(a)函数输出 1。show(b)函数中调用的为 GA中的 f()函数, display(b)调用 GA中 f()函数,返回 1,display(b)调用 GB中的 f()函数返回 2。所以最后输出为 1112。 【知识模块】 继承和

23、派生 24 【正确答案】 D 【试题解析】 在派生类 class B中对基类中的虚拟成员函数 virtual voidf()和实函数 void gO进行了重新定义,在主函数中通过语句 show(b);调用派生类中的虚函数 virrual void f()cout3; 输出 3,调用基类的实函数 void g()cout2; 输出2。所以选项 D为正确答案。 【知识模块】 继承和派生 25 【正确答案】 B 【试题解析】 在主函数中定义了一个基类 B的指针变量 ptr,并调用类 D的构造函数创建了类 D的实例对象,因为变量 count是全局变量所以在调用基类 B的构造函数给其值加 l,在调用 D

24、的构造函数时给其值加 1,因而输出其值 等于 2,在类 D的构造函数中给成员变量 y的值加 100,所以其等于 120并输出。 【知识模块】 继承和派生 26 【正确答案】 B 【试题解析】 函数 function1()在基类 Base中定义为虚成员函数,而在派生类Dervied中重新进行了定义,输出字符 2,函数 function2()在基类 Base中定义虚成员函数,在主函数中使用指向基类的指针变量 p访问 function2()时,输出 1。 【知识模块】 继承和派生 27 【正确答案】 D 【试题解析】 在基类 B中定义虚函数 f()和 成员函数 g(),而在派生类 D中定义了函数 f()和同名函数 g()。而函数 h中的形参为指向基类的指针变量 p,所以在主函数中执行 h(&obj)时,会调用派生类的函数 f(),输出 D,再调用基类的函数 g(),输出 B。 【知识模块】 继承和派生

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

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

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