1、国家二级 C+机试(继承和派生)模拟试卷 10及答案与解析 一、选择题 1 有如下程序: #include using namespace std; class BASE public: BASE()cout 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(typ
2、e, “Jazz“); strcpy(title, str); ; 下列叙述中正确的是 ( )。 ( A)程序编译正确 ( B)程序编译时语句 出错 ( C)程序编译时语句 出错 ( D)程序编译时语句 和 都出错 12 有如下类定义: class B public: void fun1() private: void fun2() protected: void fun3() ; class D: public B protected: void fun4() ; 若 obi是类 D的对象,则下列语句中不违反访问控制权限的是 ( )。 ( A) obj fun1(); ( B) obj fu
3、n2(); ( C) obj fun3(); ( D) obj fun4(); 13 有如下程序: #include using namespace std; class Media public: void Name(); void Show(); protected: int page; ; class Book: private Media public: void Print() cout using namespace std; class Base protected: Base()cout using namespace std; class AA public: AA()cou
4、t using namespace std; class Base int a, b; public: Base(int x, int y)a=x; b=y; void show()cout using namespace std; class B public: virtual void show()coutshow(); 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; 程序的输出结果是 ( )。 (
5、A) BBB ( B) BBD ( C) DBB ( D) DBD 23 下列选项中,与实现运行时多态性无关的是 ( )。 ( A)重载函数 ( B)虚函数 ( C)指针 ( D)引用 24 有如下程序: #include using namespace std; class Publication出版物类 char name30; public: Publication(char*name=“未知名称 “) strcpy(this-name, name); const char*getNameoconstreturn name; virtual const char*getType()con
6、streturn“未知类型 “; ; class Book: public Publication书类 public: Book(char*name): Publication(name) virtual const char*getType()constreturn“书 “; ; void showPublication(Publication &p) cout using namespace std; class Instrument public: virtual void Display()=0: ; class Piano: public Instrument public: voi
7、d Display() *函数体程序略 * ; int main() Instrument s; Instrument*p=0; ; return 0; 下列叙述中正确的是 ( )。 ( A)语句 “Insturment*p=0; ”编译时出错 ( B)语句 “Instruments; ”编译时出错 ( C)类 Piano中的 Display函数不是虚函数 ( D)类 Instrument是一个虚基类 26 有如下程序: #include using namespace std; class Base public: virtual void Show()coutShow(); p2-Show
8、(); delete p1: delete p2; return 0; 运行这个程序的输出结果是 ( )。 ( A) BB ( B) BD ( C) DB ( D) DD 国家二 级 C+机试(继承和派生)模拟试卷 10答案与解析 一、选择题 1 【正确答案】 D 【试题解析】 此题考查的是派生类的定义和使用。当对象被删除时,派生类的析构函数就被执行。由于析构函数不能被继承,因此在执行派生类的析构函数时,基类的析构函数也将被调用。执行顺序是先执行派生类的析构函数,再执行基类的析构函数,其顺序与执行构造函数的顺序正好相反。 【知识模块】 继承和派生 2 【正确答案】 B 【试题解析】 此题考查的
9、是继承方式。继承方式有私有 (private)、保护(protected)、公有 (public)三种。 【知识模块】 继承和派生 3 【正确答案】 D 【试题解析】 考查的是类的继承。选项 A的执行结果为 B0,建立 YY的对象y1,首先调用其构造函数, YY继承于 XX所以先调用的为 XX的构造函数,根据输入的参数可知输出 B,然后执行 YY的构造函数输出 0;同理,选项 B的执行结果为 B1,选项 C的执行结果为 B0。 【知识模块】 继承和派生 4 【正确答案】 B 【试题解析】 Student类公有继承自 Person类, Undergraduate类私有继承自Student类。所以
10、 Undergraduate类是从 Student类私有继承的。 【知识模块】 继承和派生 5 【正确答案】 C 【试题解析】 保护继承时基类中的公有成员在派生类中是保护成员。 【知识模块】 继承和派生 6 【正确答案】 B 【试题解析】 此题考查的是派生与继承中的访问权限。 protected派生: private-不可见; protected-private: public-protected。 【知识模块】 继承和派生 7 【正确答案】 B 【试题解析】 此题考查的是派生类对基类成员的访问。基类的成员有公有、保护和私有三种访问属性;类的继承方式也有公有继承、保护继承和私有继承三种。无论那
11、种继承方式,派生类中的成员都不能访问基类中的私有成员,但可以访问基类中的公有成员和保护成员。 【知识模块】 继承和派生 8 【正确答案】 C 【试题解析】 此题考查的是基类成员在派生类中的访问属性。派生类中的成员不能访问基类中的私有成员,可以访问基类中的公有成员和保护成员。派生类从基类公有继承时,基类的公有成员和保护成员在派生类中仍然是公有成员和 保护成员;派生类从基类私有继承时,基类的公有成员和保护成员在派生类中都变成私有成员;派生类从基类保护继承时,基类的公有成员在派生类中变成保护成员,基类的保护成员在派生类中仍然是保护成员。根据以上分析可知,本题中只有从B类继承的 fun2()为公有属性
12、,故选 C选项。 【知识模块】 继承和派生 9 【正确答案】 D 【试题解析】 通过公有继承定义的派生类,其成员函数可以访问基类的公有成员和保护成员,但不能访问基类的私有成员。 【知识模块】 继承和派生 10 【正确答案】 A 【试题 解析】 基类的私有成员在派生类中都是不能访问的,所以选项 B、 D是错误的,基类的公有成员通过私有继承后,在派生类中变为了私有成员,只能在派生类中进行访问,而通过派生类的对象不能访问,所以选项 C也是错误的。基类的公有成员通过公有继承后,在派生类中是公有成员,所以可以通过派生对象来访问。 【知识模块】 继承和派生 11 【正确答案】 C 【试题解析】 派生类 J
13、azz不能访问基类 Music中的私有成员 title。 【知识模块】 继承和派生 12 【正确答案】 A 【试题解析】 派生类 D公有继承父类 B,所以 obj可以访问基类 B的公有,不能访问其它成员。 【知识模块】 继承和派生 13 【正确答案】 B 【试题解析】 类 Book私有继承自类 Media,所以类 Media中的公有成员函数Name()在继承类 Book中变成了私有成员函数,因而类 Book的对象 Bible不能访问私有成员函数 Name()。 【知识模块】 继承和派生 14 【正确答案】 C 【试题解析】 此题考查的是派生类对象的构造。建立派生类对象时,构造函数的执行顺序是:
14、执行基类的构造函数,调用顺序按 照各个基类被被继承时声明的顺序;执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序;执行派生类的构造函数。此题中,在建立派生类 Derived的对象 d1时会先调用基类 Base的构造,调用的是默认构造函数,输出字符 A;然后调用自身的构造函数,输出 B:故程序的输出结果是: AB。 【知识模块】 继承和派生 15 【正确答案】 C 【试题解析】 此题考查的是继承和派生。无论使用哪种继承方式,派生类中的成员都不能访问基类中的私有成员,而可以访问基类中的公有成员和保护成员,所以选项 A错误: C+中只有抽象类不能被实例化,而虚基类不一定非得是抽象类,
15、所以选项 B错误;在派生类中可以重新定义从基类继承下来的虚函数,也可以不重新定义,故选项 D错误。 【知识模块】 继承和派生 16 【正确答案】 A 【试题解析】 在基类 AA的默认构造函数中,输出字符 1,在继承类 BB的默认构造函数中,输出字符 2,在带有参数 n的构造函数中,输出字符 3。在主函数中,在创建 BB的对象 b(4)时,会首先调用基类 AA的构造函数输出字符 1,再调用类 BB带参数的构造函数输出字符 3。在创建 BB的对象 c时,会首先调用基类AA的构造函数输出字符 1,再调用类 BB默认的构造函数输出字符 2。所以程序输出的结果为 1312。 【知识模块】 继承和派生 1
16、7 【正确答案】 A 【试题解析】 因为派生类从基类中继承,它含有基类中的数据成员和函数成员,所以当生成派生类对象时,能无条件的调用基类的构造函数。 【知识模块】 继承和派生 18 【正确答案】 C 【试题解析】 基类的构造函数是带有参数的,派生类从基类派生,这就需要在派生类的构造函数名后面显示的调用基类的构造函数。 【知识模块】 继承和派生 19 【正确答案】 C 【试题解析】 虚基类是为了消除由多重继承产生的二义性而提出的。虚基类的说明格式是: Class: vinual,其中关键字 virtual与继承方式的位置无关,但必须位于基类名之前,且 virtual只对紧随其后基类名起作用。对于
17、本题来说,声明 “classB: vinual public A”说明类 A为虚基类。 【知识模块】 继承和派生 20 【正确答案】 B 【试题解析】 此题考查的是虚函数的概念。在成员 函数的声明前面加上 Virual关键字,即可把函数声明为虚函数。虚函数可以是另一个函数的友元函数而不能是静态成员函数。 【知识模块】 继承和派生 21 【正确答案】 A 【试题解析】 此题考查的是多态性。在 C+中,一个基类指针可以用于指向它的派生类对象,而且通过这样的指针调用虚函数时,被调用的是该指针实际所指向的对象类的那个重定义版本。在实函数的情况下。通过基类指针所调用的只能是基类的那个函数版本,无法调用到
18、派生类中重定义函数。此题中,通过指针 pb所调用的是基类的本,即输出 a和 b的值 10, 20。 【知识模块】 继承和派生 22 【正确答案】 C 【试题解析】 此题考查的是虚函数与多态性。在成员函数的声明前面加上 virual关键字,即可把函数声明为虚函数;在 C+中,一个基类指针可以用于指向它的派生类对象,而且通过这样的指针调用虚函数时,被调用的是该指针实际所指向的对象类的那个重定义版本。此题中, fun1()和 fun2()的形参分别是基类的指针和引用,给 fun1()传入的实参是指向派生类对象的指针 p, fun1()将调用 D类中的show()输出字符 D;给 fun2()出入的实
19、参是 基类对象, fun2()调用类 B中的 show()输出字符 B; fun3()由于形参是基类对象,调用的始终都是基类的 show(),输出字符 B。故最终输出结果是 DBB。 【知识模块】 继承和派生 23 【正确答案】 A 【试题解析】 在 C+中,多态性可以分为两类:编译时的多态性和运行时的多态性。编译时的多态性是通过函数重载和模版体现的,运行时的多态性是通过虚函数体现的。 【知识模块】 继承和派生 24 【正确答案】 D 【试题解析】 因为类 Book继承自基类 Publication,所以在类 Book中的虚常成员函数 *getTpye()return”书 ”; 就会覆盖基类中
20、的虚常成员函数*getType()constreturn“未知类型 “; ,所以在主函数中调用函数showPublication(book)时, getType()函数的输出的结果是 “书 ”, getName()函数的输出结果为 “精彩人生 ”。 【知识模块】 继承和派生 25 【正确答案】 B 【试题解析】 由于函数 Display()是一个纯虚函数,所以类 Instrument是抽象类,而抽象类是不能定义 对象的,因而选项 B为正确选项。 【知识模块】 继承和派生 26 【正确答案】 D 【试题解析】 在基类 Base中定义了虚函数 Show()输出字符 B,而在派生类Derived中对虚函数 Show()进行了重新定义,输出字符 D。在主函数中对基类和派生类中的虚函数 Show(1)进行了多态调用,此时调用的是派生类中重新定义的Show(),输出字符 D。 【知识模块】 继承和派生
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1