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

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

1、国家二级 C+机试(继承和派生)模拟试卷 4及答案与解析 一、选择题 1 有如下程序: #include iostream using namespace std; class BASE public: BASE()cout “BASE“; ; class DERIVED: public BASE public: DERIVED()cout “DERIVED“; ; int main()DERIVED x; return 0; 执行后的输出结果是 ( )。 ( A) BASE ( B) DERIVED ( C) BASEDERIVED ( D) DERIVEDBASE 2 在下列关键字中,不能

2、用来表示继承方式的是 ( )。 ( A) private ( B) static ( C) public ( D) protected 3 有如下类定义: class XX int xx; public: xx(): xx(O)cout A; XX(int n): xx(n)cout B; ; class YY: public XX int yy; public: YY(): yy(0)cout yy; YY(int n): XX(n+1), yy(n)cout yy; YY(int m, int n): XX(m), yy(n)cout yy; ; 下列选项中,输出结果为 A0的语句是 (

3、)。 ( A) YY y1(0, 0); ( B) YY y2(1); ( C) YY y3(0); ( D) YY y4; 4 下列代码段声明了 3个类 class Person; class Student: public Person; class Undergraduate: Student; 下列关于这些类之间关系的描述中,错误的是 ( )。 ( A)类 Person是类 Undergraduate的基类 ( B)类 Undergraduate从类 student公有继承 ( C)类 student是类 Person的派生类 ( D)类 Undergraduate是类 Person的

4、派生类 5 下列描述中,错误的是 ( )。 ( A)公有继承时基类中的公有成员在派生类中仍是公有成员 ( B)公有继承时基类中的保护成员在派生类中仍是保护成员 ( C)保护继承时基类中的公有成 员在派生类中仍是公有成员 ( D)保护继承时基类中的保护成员在派生类中仍是保护成员 6 有如下类声明: class MyBASE int k; public: void set(int n)k=n; int get()constreturn k; ; class MyDERIVED: protected MyBASE protected: int j; public: void set(int m, i

5、nt n)MyBASE: set(m); j=n; int getoconstreturn MyBASE: get()+j; ; 则类 MyDERIVED中保护的数据成员和成员函数的个数是 ( )。 ( A) 4 ( B) 3 ( C) 2 ( D) 1 7 在公有继承的情况下,允许派生类直接访问的基类成员包括 ( )。 ( A)公有成员 ( B)公有成员和保护成员 ( C)公有成员、保护成员和私有成员 ( D)保护成员 8 若有如下类定义: class B void fun1() protected: dOuble varl; public: void fun2() ; class D: p

6、ublic B protected: void fun3() ; 己知 obj是类 D的对象,下列句中不违反类成员访问控制权限的是 ( )。 ( A) obj fun1(); ( B) obj varl; ( C) obj fun2(); ( D) obj fun3(); 9 对于通过公有继承定义的派生类,若其成员函数可以直接访问基类的某个成员,说明该基类成员的访问权限是 ( )。 ( A)公有或私有 ( B)私有 ( C)保护或私有 ( D)公有或保护 10 通过派生类 的对象可直接访问其 ( )。 ( A)公有继承基类的公有成员 ( B)公有继承基类的私有成员 ( C)私有继承基类的公有成

7、员 ( D)私有继承基类的私有成员 11 有如下程序: #include iostrcam using namespace std; class Music public: void setTitle(char* str)strcpy(title, str); protected: Char type10; private: char title20; ; class Jazz: public Music public: void set(char* str) strcpy(type, “Jazz“); strcpy(title, str); ; 下列叙述中正确的是 ( )。 ( A)程序编译

8、正确 ( B)程序编译时语句 出错 ( C)程序编译时语句 出错 ( D)程序编译时语句 和 都出错 12 有如下类定义: class B public: void fun1() private: void fun2() protected: void fun3() ; class D: public B protected: void fun4() ; 若 obj是类 D的对象,则下列语句中不违反访问控制权限的是 ( )。 ( A) obj fun1(); ( B) obj fun2(); ( C) obj fun3(); ( D) obj fun4(); 13 有如下程序: #includ

9、e iostream using namespace std; class Media public: void Name(); void Show(); protected: int page; ; class Book: private Media public: void Print()cout page endl; void Show()Media: Show(); ; int main() Book Bible; Bible Name(); Bible Print(); Bible Show(); return 0; 编译时有错误的是 ( )。 ( A)语句 ( B)语句 ( C)语

10、句 ( D)语句 14 有如下程序 #include iostream using namespace std; class Base protected: Base()cout A; Base(char c)cout c; ; class Derived: public Base public: Derived(char c)cout c; ; int main() Derived d1(B); return 0; 执行这个程序屏幕上将显示输出 ( )。 ( A) B ( B) BA ( C) AB ( D) BB 15 下列有关继承和派生的叙述中,正确的是 ( )。 ( A)派生类不能访问

11、基类的保护成员 ( B)作为虚基类的类不能被实例化 ( C)派生类应当向基类的构造函数传递参数 ( D)虚函数必须在派生类中重新实现 16 有如下程序: include iostream using namespace std; class AA public: AA()cout 1; ; class BB: public AA int k; public: BB(): k(0)cout 2; BB(int n): k(n)cout 3; ; int main() BB b(4), c; return 0; 运行时的输出结果是 ( )。 ( A) 1312 ( B) 132 ( C) 32 (

12、 D) 1412 17 生成派生类对象时,派生类构造函数调用基类构造函数的条件是 ( )。 ( A)无需任何条件 ( B)基类中显示定义了构造函数 ( C)派生类中显式定义了构造函数 ( D)派生类构造函数明确调用了基类构造函数 18 己知基类 Employee只有一个构造函数,其定义如下: Employee: Employee(int n): id(n) Manager是 Employee的派生类,则下列对 Manager的构造函数的定义中,正确的是 ( )。 ( A) Manager: Manager(int n): id(n) ( B) Manager: Manager(int n)id

13、=n; ( C) Manager: Manager(int n): Employee(n) ( D) Manager: Manager(int n)Employee(n); 19 下列关于虚基类的描述中,错误的是 ( )。 ( A)使用虚基类可以消除由多继承产生的二义性 ( B)构造派生类对象时,虚基类的构造函数只被调用一次 ( C)声明 “class B: virtual publicA”说明类 B为虚基类 ( D)建立派生类对象时,首先调用虚基类的构造函数 20 下列关于虚函数的说明中,正确的是 ( )。 ( A)从虚基类继承的函数都是虚函数 ( B)虚函数不得是静态成员函数 ( C)只能

14、通过指针或引用调用虚函数 ( D)抽象类中的成员函数都 是虚函数 21 如果不使用多态机制,那么通过基类的指针虽然可以指向派生类对象,但是只能访问从基类继承的成员。有如下程序,没有使用多态机制。 #include iostream using namespace std; class Base int a, b; public: Base(int x, int y)a=x; b=y; void show()cout a , b 9ndl; ; class Derived: public Base int c, d; public: Derived(int x, int y, int z, in

15、t m): Base(x, y)c=z; d=m; void show()cout c , d endl; ; int main() Base B1(50, 50), *pb; Derived D1(10, 20, 30, 40); pb=&D1; return 0: return(); 运行时输出的结果是 ( )。 ( A) 10, 20 ( B) 30, 40 ( C) 20, 30 ( D) 50, 50 22 有如下程序; #include iostream using namespace std; class B public: virtual void show()cout “B“

16、; ; class D: public B public: void show()cout “D“; ; void fun1(B *ptr)ptr- show(); void fun2(B &ref)ref show(); void fun3(B b)b show(); int main() B b, *p=new D; D d; fun1(p); fun2(b); fun3(d); return 0; 程序的输出结果是 ( )。 ( A) BBB ( B) BBD ( C) DBB ( D) DBD 23 下列选项中,与实现运行时多态性无关的是 ( )。 ( A)重载函数 ( B)虚函数 (

17、 C)指针 ( D)引用 24 有如下程序: include iostrearn using namespace std; class Publication出版物类 char name30; public: Publication(char *name=“未知名称 “) strcpy(this- name, name); const char * getName()constreturn name; virtual const char * getType()constreturn“未知类型 “; ; class Book: public Publication书类 public: Book

18、(char *name): Publication(name) virtual const char * getType()constreturn“书 “; ; void showPublication(Publication &p) cout p getType() “: “ p getName() endl; int main() Book book(“精彩人生 “); showPublication(book); return 0; 运行时的输出结果是 ( )。 ( A)未知类型:未知名称 ( B)未知类型:精彩人生 ( C)书:未知名称 ( D)书:精彩人生 25 有如下程序: #in

19、clude iostream using namespace std; class Instrument public: virtual void Display()=0; ; class Piano: public Instrument public: void Display() *函数体程序略 * ; int main() Instrument s: Instrument *p=0; ; return 0; 下列叙述中正确的 是 ( )。 ( A)语句 “Insturment *p=0; “编译时出错 ( B)语句 “Instrument s; “编译时出错 ( C)类 Piano中的

20、Display函数不是虚函数 ( D)类 Instrument是一个虚基类 26 有如下程序: #include iostream using namespace std; class Base public: virtual void Show()cout B; ; class Derived: public Base public: void Show()cout D; ; int main() Base *p1=new Derived; Derived *p2=new Derived; p1- Show(); p2- Show(); delete p1; delete p2; retur

21、n 0; 运行这个程序的输出结果是 ( )。 ( A) BB ( B) BD ( C) DB ( D) DD 国家二级 C+机试(继承和派生)模拟试卷 4答案与解析 一、选择题 1 【正确答案】 D 【试题解析】 此题考查的 是派生类的定义和使用。当对象被删除时,派生类的析构函数就被执行。由于析构函数不能被继承,因此在执行派生类的析构函数时,基类的析构函数也将被调用。执行顺序是先执行派生类的析构函数,再执行基类的析构函数,其顺序与执行构造函数的顺序正好相反。 【知识模块】 继承和派生 2 【正确答案】 B 【试题解析】 此题考查的是继承方式。继承方式有私有 (private)、保护(prote

22、cted)、公有 (public)三种。 【知识模块】 继承和派生 3 【正确答案】 D 【试题解析】 考查的 是类的继承。选项 A的执行结果为 BO,建立 YY的对象y1,首先调用其构造函数, YY继承于 XX所以先调用的为 XX的构造函数,根据输入的参数可知输出 B,然后执行 YY的构造函数输出 0;同理,选项 B的执行结果为 B1,选项 C的执行结果为 B0。 【知识模块】 继承和派生 4 【正确答案】 B 【试题解析】 Student类公有继承自 Person类, Undergraduate类私有继承自Student类。所以 Undergraduate类是从 Student类私有继承的

23、。 【知识模块】 继承和派生 5 【正确答案】 C 【试题解析】 保护继承时基类中的公有成员在派生类中是保护成员。 【知识模块】 继承和派生 6 【正确答案】 B 【试题解析】 此题考查的是派生与继承中的访问权限。 protected派生: private-不可见: protected- private: public- protected。 【知识模块】 继承和派生 7 【正确答案】 B 【试题解析】 此题考查的是派生类对基类成员的访问。基类的成员有公有、保护和私有三种访问属性:类的继承方式也有公有继承、 保护继承和私有继承三种。无论那种继承方式,派生类中的成员都不能访问基类中的私有成员,但

24、可以访问基类中的公有成员和保护成员。 【知识模块】 继承和派生 8 【正确答案】 C 【试题解析】 此题考查的是基类成员在派生类中的访问属性。派生类中的成员不能访问基类中的私有成员,可以访问基类中的公有成员和保护成员。派生类从基类公有继承时,基类的公有成员和保护成员在派生类中仍然是公有成员和保护成员;派生类从基类私有继承时,基类的公有成员和保护成员在派生类中都变成私有成员:派生类从基类保护继承时,基类的公有 成员在派生类中变成保护成员,基类的保护成员在派生类中仍然是保护成员。根据以上分析可知,本题中只有从B类继承的 fun2()为公有属性,故选 C选项。 【知识模块】 继承和派生 9 【正确答

25、案】 D 【试题解析】 通过公有继承定义的派生类,其成员函数可以访问基类的公有成员和保护成员,但不能访问基类的私有成员。 【知识模块】 继承和派生 10 【正确答案】 A 【试题解析】 基类的私有成员在派生类中都是不能访问的,所以选项 B、 D是错误的,基类的公有成员通过私有继承后,在派生类中变为了 私有成员,只能在派生类中进行访问,而通过派生类的对象不能访问,所以选项 C也是错误的。基类的公有成员通过公有继承后,在派生类中是公有成员,所以可以通过派生对象来访问。 【知识模块】 继承和派生 11 【正确答案】 C 【试题解析】 派生类 Jazz不能访问基类 Music中的私有成员 title。

26、 【知识模块】 继承和派生 12 【正确答案】 A 【试题解析】 派生类 D公有继承父类 B,所以 obj可以访问基类 B的公有,不能访问其它成员。 【知识模块】 继承和派生 13 【正确 答案】 B 【试题解析】 类 Book私有继承自类 Media,所以类 Media中的公有成员函数Name()在继承类 Book中变成了私有成员函数,因而类 Book的对象 Bible不能访问私有成员函数 Name( )。 【知识模块】 继承和派生 14 【正确答案】 C 【试题解析】 此题考查的是派生类对象的构造。建立派生类对象时,构造函数的执行顺序是:执行基类的构造函数,调用顺序按照各个基类被被继承时声

27、明的顺序;执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序:执行派生类的 构造函数。此题中,在建立派生类 Derived的对象 dl时会先调用基类 Base的构造,调用的是默认构造函数,输出字符 A;然后调用自身的构造函数,输出 B;故程序的输出结果是: AB。 【知识模块】 继承和派生 15 【正确答案】 C 【试题解析】 此题考查的是继承和派生。无论使用哪种继承方式,派生类中的成员都不能访问基类中的私有成员,而可以访问基类中的公有成员和保护成员,所以选项 A错误; c+中只有抽象类不能被实例化,而虚基类不一定非得是抽象类,所以选项 B错误;在派生类中可以重新定义从基类 继承

28、下来的虚函数,也可以不重新定义,故选项 D错误。 【知识模块】 继承和派生 16 【正确答案】 A 【试题解析】 在基类 AA的默认构造函数中,输出字符 1,在继承类 BB的默认构造函数中,输出字符 2,在带有参数 n的构造函数中,输出字符 3。在主函数中,在创建 BB的对象 b(4)时,会首先调用基类 AA的构造函数输出字符 1,再调用类 BB带参数的构造函数输出字符 3。在创建 BB的对象 c时,会首先调用基类AA的构造函数输出字符 1,再调用类 BB默认的构造函数输出字符 2。所以程序输出 的结果为 1312。 【知识模块】 继承和派生 17 【正确答案】 A 【试题解析】 因为派生类从

29、基类中继承,它含有基类中的数据成员和函数成员,所以当生成派生类对象时,能无条件的调用基类的构造函数。 【知识模块】 继承和派生 18 【正确答案】 C 【试题解析】 基类的构造函数是带有参数的,派生类从基类派生,这就需要在派生类的构造函数名后面显示的调用基类的构造函数。 【知识模块】 继承和派生 19 【正确答案】 C 【试题解析】 虚基类是为了消除由多重继承产生的 二义性而提出的。虚基类的说明格式是: Class类名: virtual继承方式基类名,其中关键字 virtual与继承方式的位置无关,但必须位于基类名之前,且 virtual只对紧随其后基类名起作用。对于本题来说,声明 “clas

30、s B: virtual public A”说明类 A为虚基类。 【知识模块】 继承和派生 20 【正确答案】 B 【试题解析】 此题考查的是虚函数的概念。在成员函数的声明前面加上 ritual关键字,即可把函数声明为虚函数。虚函数可以是另一个函数的友元函数而不能是静 态成员函数。 【知识模块】 继承和派生 21 【正确答案】 A 【试题解析】 此题考查的是多态性。在 C+中,一个基类指针可以用于指向它的派生类对象,而且通过这样的指针调用虚函数时,被调用的是该指针实际所指向的对象类的那个重定义版本。在实函数的情况下。通过基类指针所调用的只能是基类酌那个函数版本,无法调用到派生类中重定义函数。此

31、题中,通过指针 pb所调用的是基类的版本,即输出 a和 b的值 10, 20。 【知识模块】 继承和派生 22 【正确答案】 C 【试题解析】 此题考查的是虚函 数与多态性。在成员函数的声明前面加上 virual关键字,即可把函数声明为虚函数;在 C+中,一个基类指针可以用于指向它的派生类对象,而且通过这样的指针调用虚函数时,被调用的是该指针实际所指向的对象类的那个重定义版本。此题中, fun1()和 fun2()的形参分别是基类的指针和引用,给 fun1()传入的实参是指向派生类对象的指针 p, fun1()将调用 D类中的show()输出字符 D;给 fun2()出入的实参是基类对象, f

32、un2()调用类 B中的 show()输出字符 B: fun3()由于形参是基类对象,调用的始 终都是基类的 show(),输出字符 B。故最终输出结果是 DBB。 【知识模块】 继承和派生 23 【正确答案】 A 【试题解析】 在 C+中,多态性可以分为两类:编译时的多态性和运行时的多态性。编译时的多态性是通过函数重载和模版体现的,运行时的多态性是通过虚函数体现的。 【知识模块】 继承和派生 24 【正确答案】 D 【试题解析】 因为类 Book继承自基类 Publication,所以在类 Book中的虚常成员函数 * getType()return“书 “; 就会覆盖基类中的 虚常成员函数

33、*getTrype()eonstreturn“未知类型 “; ,所以在主函数中调用函数showPublication(book)时, getType()函数的输出的结果是 “书 ”, getName()函数的输出结果为 “精彩人生 ”。 【知识模块】 继承和派生 25 【正确答案】 B 【试题解析】 由于函数 Display()是一个纯虚函数,所以类 Instrument是抽象类,而抽象类是不能定义对象的,因而选项 B)为正确选项。 【知识模块】 继承和派生 26 【正确答案】 D 【试题解析】 在基类 Base中定义了虚函数 Show()输出字符 B,而在派生类Derived中对虚函数 Show()进行了重新定义,输出字符 D。在主函数中对基类和派生类中的虚函数 Show()进行了多态调用,此时调用的是派生类中重新定义的Show(),输出字符 D。 【知识模块】 继承和派生

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

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

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