1、国家二级 C+机试(继承和派生)模拟试卷 2及答案与解析 一、选择题 1 有如下程序 #include using namespace std; class Base protected: Base()cout using namespace std; class A public: A(int i)x=i; void dispa()cout using namespace std; class Base int x; public; Baseint 11=O); x(n)cout using namespace std; class AA public: AA0cout using name
2、space std; class C1 public: -ClOcout using namespace std; class Base public: Base(int x=O): valB(x)cout using namespace std; class Basel public: Basel(int d) cout using namespace std; class A public: AOcout using namespace std; class Base public: void fun()coutfun(); 16 下列关于虚基类的描述中,错误的是 ( )。 ( A)使用虚
3、基类可以消除由多继承产生的二义性 ( B)构造派生类对象时,虚基类 的构造函数只被调用一次 ( C)声明 “class B: virtual public A”说明类 B为虚基类 ( D)建立派生类对象时,首先调用虚基类的构造函数 17 有如下程序: #include using namespace std; class Mountain int height; public: Mountain(int h=O): height(h) virtual char*GetName0 constreturn”山 ”; int GetHeight() constreturn height; ) );
4、class Lushan: public Mountain Public: Lushan(int d): Mountain(d) , Char*GetName()constreturn”庐山 ”; ) ); int main() Mountain*p=new Lushan(1 000); coutGetName0GetHeight() using namespace std; class Base public: void funlOcout using namespace std; class A public: virtual void funcl()coutfuncl(); P一 fun
5、c2(); return 0: ) 运行此程序,屏幕上将显示输出 ( )。 ( A) B182 ( B) A1A2 ( C) B1A2 ( D) A182 22 如果不使用多态机制,那么通过基类的指针虽然可以指向派生类对象,但是只能访问从基类继承的成员。有如下程序,没有使用多态机制。 #include 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 Base public: virtual void
6、 f()coutf(); P一 g(); return O: ) 运行时输出的结果是 ( )。 ( A) f+g+ ( B) fo+g+ ( C) f+g0+ ( D) f0+g0+ 24 有如下程序; #include using namespace std; class Base public: void outputocoutoutput(); ptr一 Print(); delete ptr; return (): ) 程序的输出结果是 ( )。 ( A) lB ( B) lD ( C) 2B ( D) 2D 25 有如下程序: #include using namespace std
7、; class B public: virtual void show()coutshow(); ) void fun2(B ); class Piano: public Instrument public: void Display() *函数体程序略 * ) ; int main() Instrument s; Instrument*P=0: ; retum 0: 下列叙述中正确的是 ( )。 ( A)语句 “Insturment*p=O; ”编译时出错 ( B)语句 “Instrument s; ”编译时出错 ( C)类 Piano中的 Display函数不是虚函数 ( D)类 Inst
8、rument是 一个虚基类 35 有如下程序: #include 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(); coutCategory(); return O: 若程序运行时输出结果
9、是 “文学 ”,则划线处缺失的语句是 ( )。 ( A) char*Category(); ( B) char*Category()const; ( C) virtual char*Category()const; ( D) virtual char*Category()const=O; 36 有如下程序: #include using namespace std; class Base public: virtual void function l() coutfunctionl(); p-function2(); return O: ; 运行时的输出结果是 ( )。 ( A) 01 ( B
10、) 21 ( C) 03 ( D) 23 37 有如下程序: #include using namespace std; class Base public: virtual void Show()coutShow(); p2一 Show(); delete Pl; delete p2; return 0: ) 运行这个程序的输出结果是 ( )。 ( A) BB ( B) BD ( C) DB ( D) DD 38 有如下类定义 class Animal public: virtual void Name0=0; ; class Koala: public Animal public: voi
11、d Name() *函数体略 * ) ; 关于上述类定义,下列描述中错误的是 ( )。 ( A)类 Koala是类 Animal的派生类 ( B)类 Koala中的 Name函数是一个虚函数 ( C)类 Animal中的 Name函数是一个纯虚函数 ( D)语句 “Animal a: ”能够建立类 Animal的一个对象 a 39 有如下程序: #include using namespace std; class B public: virtual void f0coutf(); p-g(); ) int main() D obj; h( obj); return 0; ) 运行这个程序的输
12、出结果是 ( )。 ( A) DD ( B) BB ( C) BD ( D) DB 国家二级 C+机试(继承和派生)模拟试卷 2答案与解析 一、选择题 1 【正确答案】 C 【试题解析】 此题考查的是派生类对象的构造。建立派生类对象时,构造函数的执行顺序是:执行基类的构造函数,调用顺序按照各个基类被被继承时声明的顺序;执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序:执行派生类的构造函数。此题中,在建立派生类 Derived的对象 dl时会先调用基类 Base的构造,调用的是默认构造函数,输出字符 A;然后调用自身的构造函数,输出 B;故程序的输出结粜是: AB。 2 【正确答
13、案】 A 【试题解析】 此题考查的是派生类对象的析构。释放派生类对象时,析构函数的执行顺序是:首先调用派生类自身的析构函数;然后渊用类成员对象的析构函数;最后调用基类的析构函数。所以四个选项中只有选项 A正确。 3 【正确答案】 D 【试题解析】 此题考查的是派生类的构造函数和析构蛹数。在撤销派生类对象时,析构函数的执行过程和构造函数严格相反,即:对派生类新增普通成员进行清理:调用成员对象析构函数,调用基类析构 函数对基类进行清理。 4 【正确答案】 C 【试题解析】 此题考查的是继承和派生。无论使用哪种继承方式,派生类中的成员都不能访问基类中的私有成员,而可以访问基类中的公有成员和保护成员,
14、所以选项 A错误; c+中只有抽象类不能被实例化,而虚基类不一定非得是抽象类,所以选项 B错误;住派生类中可以重新定义从基类继承卜来的虚函数,也可以不重新定义,故选项 D错误。 5 【正确答案】 C 【试题解析】 此题考企的是派生类的构造。主函数中,首先声明 B类的对象 b,执行进入 B的构造函数 B(int i)阿接着 执行 A的构造函数 A(inti),形参 i为 12, x被赋值 12;通过对象 b渊用其成员函数 dispb(),输出结果 12;接着执行函数dispb()的第 2条语句输出 2,然后主函数结束。 6 【正确答案】 C 【试题解析】 此题考查的是派生类的构造与析构。建立派生
15、类的对象时,构造函数的执行顺序如下:执行基类的构造函数,调用顺序按照各个基类被继承时声明的顺序 (自左向右 ) 执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序一 执行自身的构造函数。此题中,执行语句 Derived d1(3)首先调 用基类的构造函数,输出 0;接着调用自身的构造函数输出 3。执行语句 Derived d2(5, 7)时,会调用基类的 Base(n)函数输出 7:然后执行继承类 rlI的 Derived(int m, int n)的 v(m)输出 5。 7 【正确答案】 A 【试题解析】 在基类 AA的默认构造函数中,输出字符 1,在继承类 BB的默认构造函数
16、中,输出字符 2,在带有参数 n的构造函数中,输出字符 3。在主函数中,在创建 BB的对象 b(4)时,会首先调用基类 AA的构造函数输出字符 l,再调用类 BB带参数的构造函数输出 字符 3。在创建 BB的对象 c时,会首先调用基类AA的构造函数输出字符 1,再调用类 BB默认的构造函数输出字符 2。所以程序输出的结果为 1312。 8 【正确答案】 B 【试题解析】 在主函数中定义 C2类的对象,当程序结束时,首先调用 C2类的析构函数 C2,输出 2,冉调用 Cl类的析构函数 Cl,输出 l。所以程序运行的结果就是 2l。 9 【正确答案】 A 【试题解析】 在主函数中创建类 Deriv
17、ed对象 objl2(2, 3)时,因为类 Derived是从基类 Base派生而来,所以首先调用基 类的构造函数,输出 2,冉调用派生类构造函数,输出 3。当主函数运算结果时,首先调用派生类的析构函数,输出 3,再调用基类的析构函数输出 2。所以输出结果为 2332。 10 【正确答案】 A 【试题解析】 因为派生类从基类中继承,它含有基类中的数据成员和函数成员,所以当生成派生类对象时,能无条件的调用基类的构造函数。 11 【正确答案】 B 【试题解析】 根据派生类构造函数的一般格式: (): () (), (), ()。在派生类 BB的构造函数总参数表后面应该接上基类名 AA和其参数。 1
18、2 【正确答案】 D 【试题解析】 程序存创建派生类对象 d时,分别调用基类 Basel和 Basel的构造函数。 13 【正确答案】 C 【试题解析】 基类的构造函数是带有参数的,派生类从基类派生,这就需要在派生类的构造函数名后而显示的调用基类的构造函数。 14 【正确答案】 B 【试题解析】 派生类 B是由基类 A公开继承而来,所以在创建类 B的 obj对象时,首先执行基类 A的构造函数 A(),输出 A,再执行派生类 B的构造函数 B(),输出 G,当程序结束时,首先执行派生类的析构函数 B(),输出 T,再执行基类A的析构函数 A(),输出 c。 15 【正确答案】 C 【试题解析】
19、派生类 Derived的对象 d调用其成员函数 mn(),要输出结果为BD,所以在其成员函数 fun()中要调用基类 Base的成员函数 fun()。 16 【正确答案】 C 【试题解析】 虚基类是为了消除南多重继承产生的二义性而提出的。虚基类的说明格式是: class: virtual,其中关键字 virtual与继承方式的位置无关,但必须位于基类名之前,日 virtual只对紧随其后基类名起作用。对于本题来说,声明 “class B: virtual public A”说明类 A为虚基类。 17 【正确答案】 A 【试题解析】 在基类 Mountain中定义了虚函数 GetName()输出
20、字符串 “山 ”,而在派生类 Lushan中对虚函数 GetName()进行了重新定义,输出字符串 “庐山 ”。在主函数中对派生类中的虚函数 GetName()进行了 多态调用,此时调用的是派生类中重新定义的 GetName(),输出字符字符串 “庐山 ”。 18 【正确答案】 D 【试题解析】 此题考查的是虚函数的概念。 C+语言的多态性有两种:函数重载和虚函数。虚函数只有红运行时才能被确定,称为运行时多态。编译时的多态是通过函数重载和模板实现的。 19 【正确答案】 B 【试题解析】 此题考查的是虚函数的概念。在成员函数的声明前面加上 virual关键字,即可把函数声明为虚函数。虚函数可以
21、是另一个函数的友元函数而不能是静态成员函数。 20 【正确答案】 B 【试题解析】 此题考查的是虚函数的概念。在 C+语言中,一个派生类的对象可以被它的任何一个基类的指针所指向,若基类和派生类中存在一模一样的成员函数。那么通过该基类指针调用这样的成员函数时,若这个成员函数被定义成虚函数,那么就调用派生类中的;否则就调用基类中的。本题中,在 f()函数中,形参b是一个基类的引用,它引用的是主函数中定义的派生类对象 obi,所以在调用fun()时,运行的是基类的版本,而 fun2()运行的是派生类的版本。 21 【正确答案】 C 【试题解析】 此题考查的是虚函数的 概念。此题中, funcl是虚函数, fhnc2是一般成员函数,而且在派生类与基类中都存在两个这样的函数。在主函数中,语句