1、国家二级 C+机试(继承和派生)模拟试卷 7及答案与解析 一、选择题 1 对于通过公有继承定义的派生类,若其成员函数可以直接访问基类的某个成员,说明该基类成员的访问权限是 ( )。 ( A)公有或私有 ( B)私有 ( C)保护或私有 ( D)公有或保护 2 建立一个有成员对象的派生类对象时,各构造函数体的执行次序为 ( )。 ( A)派生类、成员对象类、基类 ( B)成员对象类、基类、派生类 ( C)基类、成员对象类、派生类 ( D)基类、派生类、成员对象类 3 有如下类定义和变量 定义: class Parents public: int publicData; prlVate: mt p
2、rivateData; ; class ChildA: public Parents *类体略 * ; class ChildB: private Parents *类体略 * ); ChildA a: ChildB b: 下列语句中正确的是 ( )。 ( A) cout a publicData endl; ( B) cout a priVateData endl; ( C) cout b publicData endl; ( D) cout b priVateData endl; 4 通过派生类的对象可直接访问其 ( )。 ( A)公有继承基类的公有成员 ( B)公有继承基类的私有成员 (
3、 C)私有继承基类的公有成员 ( D)私有继承基类的私有成员 5 有如下程序: #inc1ude 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(4); 4 retum 0: 在标注号码的四条语句中正确的是 ( )。 ( A
4、) 1 ( B) 2 ( C) 3 ( D) 4 6 有如下两个类定义 class XX priVate: doUble x1; proteCted: double x2; public: double x3: ; class YY: protected XX private: double y1; potected: double y2; public: double y3; ; 在类 YY中保护成员变量的个数是 ( )。 ( A) 1 ( B) 2 ( C) 3 ( D) 4 7 有如下程序: #inc1ude iostream using namespace std; class Mus
5、ic 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)程序编译正确 ( B)程序编译时语句 出错 ( C)程序编译时语句 出错 ( D)程序编译时语句 和 都出错 8 当派生类从一个基类保护继承时,基类中的一
6、些成员在派生类中成为保护成员,这些成员在基类中原有的访问属性是 ( )。 ( A)任何 ( B)公有或保护 ( C)保护或私有 ( D)私有 9 下列关于派生类和基类的描述中,正确的是 ( )。 ( A)派生类成员函数只能访问基类的公有成员 ( B)派生类成员函数只能访问基类的公有和保护成员 ( C)派生类成员函数可以访问基类的所有成员 ( D)派生类对基类的默认继承方式 是公有继承 10 有如下类定义: class B public: void funl() private: void fun2() protected: void fun3() ; class D: public B pro
7、tected: void fun4() ; 若 obj是类 D的对象,则下列语句中不违反访问控制权限的是 ( )。 ( A) obj fun1(); ( B) obj fun2(); ( C) obj fun3(); ( D) obj fun4(); 11 有如下程序: class Base public: int data; ; class Derivedl: public Base; class Derived2: protected Base; int main() Derivedl dl; Derived2 d2; dl data=0; d2 data=0: return 0: 下列关
8、于程序编译结果的描述中,正确的是 ( )。 ( A) 皆无编译错误 ( B) 有编泽错误, 无编译错误 ( C) 无编译错误, 有编译错误 ( D) 皆有编译错误 12 有如下程序: #inc1ude iostream using namespace std; class XX int X; public: XX(int xx=0): x(xx) int getX() return x; ; class YY: public XX int y; public: YY(int xx, int yy): XX(xx), y(yy) int getV() return getX()+y; ; int
9、 main() YY c(3, 4); cout c getV()+c getX0 endl; return 0; 运行这个程序的输出结果是 ( )。 ( A) 3 ( B) 4 ( C) 7 ( D) 10 13 有如下程序: #inc1ude 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()Med
10、ia: Show(); ) ; int main() Book Bible; Bible Name(); Bible Print(); Bible Show(); return 0: 编译时有错误的是 ( )。 ( A)语句 ( B)语句 ( C)语句 ( D)语句 14 有如下程序: #inc1ude iostream using namespace std; class A public: A()cout “A“; ; classB public: B() cout “B“; classC: public A B b; public: C()cout “C“; ) ; int main()
11、 C obj; return 0; 执行后的输出结果是 ( )。 ( A) CBA ( B) BAC ( C) ACB ( D) ABC 15 有如下程序: #inc1ude iostream using namespace std; classA public: A()cout “A“; A()cout “ A“; ; class B: public A A*p; public: B()cout “B“; p=new A(); ) B()cout “ B”; delete p; ; int main() B obj; return 0; 执行这个程序的输出结果是 ( )。 ( A) BAA
12、A B A ( B) ABA B A A ( C) BAA B A A ( D) ABA A B A 16 有如下程序 #inc1ude 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 (
13、D) BB 17 在一个派生类对象结束其生命周期时 ( )。 ( A)先调用派生类的析构函数后调用基类的析构函数 ( B)先调用基类的析构函数后调用派生类的析构函数 ( C)如果基类没有定义析构函数,则只调用派生类的析构函数 ( D)如果派生类没有定义析构函数,则只调用基类的析构函数 18 下列关于派生类构造函数和析构函数的说法中,错误的是 ( )。 ( A)派生类的构造函数会隐含调用基类的构造函数 ( B)如果基类中没有缺省构造函数,那么派生类必须定义构造函数 ( C)在建立派生类对象时,先调用基类的构造函数,再调用派生类的构造函数 ( D)在销毁 派生类对象时,先调用基类的析构函数,再调用
14、派生类的析构函数 19 下列有关继承和派生的叙述中,正确的是 ( )。 ( A)派生类不能访问基类的保护成员 ( B)作为虚基类的类不能被实例化 ( C)派生类应当向基类的构造函数传递参数 ( D)虚函,数必须在派生类中重新实现 20 有如下程序: #inc1ude iostream using namespace std; class A public: A(int i)x=i; ) void dispa()cout x , ; private: int x; ; class B: public A public: B(int i): A(i+10)x=i; void dispb() dis
15、pa(); cout x end1; private int x: ; int main() B b(2); b dispb(); return 0: 运行时输出的结果是 ( )。 ( A) 10, 2 ( B) 12, 10 ( C) 12, 2 ( D) 2, 2 21 有如下程序: #inc1ude iostream using namespace std; class Base int x: public; Base int n=0; x(n) cout n, Int getX()const return x; ; class Derived public Base int y; pu
16、blic; Derived(int m, int n): y(m), Base(n) cout m; Derived(int m): y(m) cout m, ; int main() Derived dl(3), d2(5, 7); Return 0: 运行时的输出结果是 ( )。 ( A) 375 ( B) 357 ( C) 0375 ( D) 0357 22 有如下程序: #inc1ude iostream using namespace std; class AA public: AA()cout 1; ; class BB: public AA int k: public: BB()
17、: 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 ( D) 1412 23 有如下程序: #inc1ude iostream using namespace std; class c1 public: C1()cout 1; ; class C2: public C1 public: C2()cout 2; ; int main() C2 cb2; C1 *cbl; return 0; 运行时的输出结果是 ( )。
18、( A) 121 ( B) 21 ( C) 211 ( D) 12 24 有如下程序: #inc1ude iostream using namespace std; class Base public: Base(int x=0): valB(x) cout valB; Base() cout valB; private: int valB; ; class Derived: public Base public: Derived(int x=0, int y=0): Base(x), valD(y) cout valD; Derived()cout vaID; private: int va
19、lD; ; int main() Derived obj 12(2, 3); return 0; 运行时的输出结果是 ( )。 ( A) 2332 ( B) 2323 ( C) 3232 ( D) 3223 25 生成派生类对象时,派生类构造函数调用基类构造函数的条件是 ( )。 ( A)无需任何条件 ( B)基类中显示定义了构造函数 ( C)派生类中显式定义了构造函数 ( D)派生类构造函数明确调用了基类构造函数 国家二级 C+机试(继承和派生)模拟试卷 7答案与解析 一、选择题 1 【正确答案】 D 【试题解析】 通过公有继承定义的派生类,其成员函数可以访问基类的公有成员和保护成员,但不能
20、访问基类的私有成员。 【知识模块】 继承和派生 2 【正确答案】 C 【试题解析】 建立派生类对象的时候,构造函数的执行顺序如下:执行基类的构造函数,调用的顺序按照基类被继承时候的顺序(自左向右)。然后是执行成员对象的构造函数,调用顺序按照各个成员对象在类中的声明顺序(自上而下),最后是执行派生类的构造函数。 【知识模块】 继承和派生 3 【正确答案】 A 【试题解析】 基类 Parents的私有成员 privateData在派生类 ChildA和 ChildB中是不可以访问,所以选项 B、 D是错误,而派生类 ChildB私有继承基类Parents,所以基类 Parents的公有成员 pub
21、licData在派生类 ChildB中变为私有成员,只能在派生类 ChildB内部访问,因而选项 C是错误的。派生类 ChildA公有继承基类 Parents,所以基类 Parents的公有成员 publicData在派生类 ChildA中可以访问。 【知识模块】 继承和派生 4 【正确答案】 A 【试题解析】 基类的私有成员在派生类中都是不能访问的,所以选项 B、 D是错误的,基类的公有成员通过私有继承后,在派生类中变为了私有成员,只能 在派生类中进行访问,而通过派生类的对象不能访问,所以选项 C也是错误的。基类的公有成员通过公有继承后,在派生类中是公有成员,所以可以通过派生对象来访问。 【
22、知识模块】 继承和派生 5 【正确答案】 B 【试题解析】 因为类 BB公有继承自类 AA,所以 AA中的保护成员和公有成员在类 BB中仍是保护成员和公有成员。在选项 B中调用了公有成员函数 setN( int n) this一 n=n; ,对保护成员 n进行赋值操作。 【知识模块】 继承和派生 6 【正确答案】 C 【试题解析】 在 C+中派生类从基类保护继承时,基类的公有成员在派生类中改变为保护成员,基类的保护成员在派生类中仍为保护成员。所以对于本题来说,YY类保护继承自类 XX,那么类 XX中的公有成员 x3和保护成员 x2在派生类中都成为保护成员,再加上类 YY中的保护成员 y2,因此
23、在派生类 YY中保护成员的个数为 3。 【知识模块】 继承和派生 7 【正确答案】 C 【试题解析】 派生类 Jazz不能访问基类 Music中的私有成员 title。 【知识模块】 继承和派生 8 【正确答案】 B 【试题解析】 基类的公有 成员和保护成员只有在以保护继承方式继承时,其在继承类中是保护成员。 【知识模块】 继承和派生 9 【正确答案】 B 【试题解析】 派生类不论是采用那种继承方式继承基类,它的成员函数只能访问基类的公有成员和保护成员。 【知识模块】 继承和派生 10 【正确答案】 A 【试题解析】 派生类 D公有继承父类 B,所以 obj可以访问基类 B的公有,不能访问其它
24、成员。 【知识模块】 继承和派生 11 【正确答案】 C 【试题解析】 保护继承的类 Dervied2不能访问基类 Base中的公共数据成员data。 【知识模块】 继承和派生 12 【正确答案】 D 【试题解析】 由于类 YY公开继承自类 XX,所以执行表达式c getV()+c getX()的值等于 3+3+4一 10。 【知识模块】 继承和派生 13 【正确答案】 B 【试题解析】 类 Book私有继承自类 Media,所以类 Media中的公有成员函数Name()在继承类 Book中变成了私有成员函数,因而类 Book的对象 Bible不能访问私有成员函数 Name( )。 【知识模块
25、】 继承 和派生 14 【正确答案】 D 【试题解析】 此题考查的是类的继承和派生。系统首先要通过派生类的构造函数调用基类的构造函数,对基类成员初始化;然后对派生类中的新增成员初始化。 【知识模块】 继承和派生 15 【正确答案】 B 【试题解析】 此题考查的是派生类对象的构造与析构。建立派生类对象时,构造函数的执行顺序如下:执行基类的构造函数,调用顺序按照各个基类被定义时声明的顺序(自左向右)执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序执行派生类的构造函数。所以 本题在建立派生类 B的对象 obj是会先调用基类 A的构造函数,然后调用自身的构造函数。注意: B类中定义的成
26、员 p是 A类的指针而不是一个对象,故在调用自身构造函数前不需要构造。而在 B类构造函数中使用 new操作符动态地构造了一个 A类的对象,所以整个构造结果是输出: ABA。派生类对象的析构与构造严格相反,即先析构自身,然后析构自身所包含的成员对象,最后调用基类的析构函数。故本题中当 main()函数返回时,析构 B类的对象 obj:首先调用 B(),接着再调用 A()因为在 B()函数中释放了动态创建的 A类对象,故整个析构所 输出的结果是 B A A。所以这个程序输出结果为 ABA B A A 【知识模块】 继承和派生 16 【正确答案】 C 【试题解析】 此题考查的是派生类对象的构造。建立
27、派生类对象时,构造函数的执行顺序是:执行基类的构造函数,调用顺序按照各个基类被被继承时声明的顺序;执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序;执行派生类的构造函数。此题中,在建立派生类 Derived的对象 dl时会先调用基类 Base的构造,调用的是默认构造函数,输出字符 A;然后调用自身的构造函数,输出 B:故程序的输出结果是: AB。 【知识模块】 继承和派生 17 【正确答案】 A 【试题解析】 此题考查的是派生类对象的析构。释放派生类对象时,析构函数的执行顺序是:首先调用派生类自身的析构函数:然后调用类成员对象的析构函数;最后调用基类的析构函数。所以四个选项中只
28、有选项 A正确。 【知识模块】 继承和派生 18 【正确答案】 D 【试题解析】 此题考查的是派生类的构造函数和析构函数。在撤销派生类对象时,析构函数的执行过程和构造函数严格相反,即:对派生类新增普通成员进行清理;调 用成员对象析构函数,调用基类析构函数对基类进行清理。 【知识模块】 继承和派生 19 【正确答案】 C 【试题解析】 此题考查的是继承和派生。无论使用哪种继承方式,派生类中的成员都不能访问基类中的私有成员,而可以访问基类中的公有成员和保护成员,所以选项 A错误: C+中只有抽象类不能被实例化,而虚基类不一定非得是抽象类,所以选项 B错误;在派生类中可以重新定义从基类继承下来的虚函
29、数,也可以不重新定义,故选项 D错误。 【知识模块】 继承和派生 20 【正确答案】 C 【试题解析】 此题考查的是派生类的构造。主函数中,首先声明 B类的对象 b,执行进入 B的构造函数 B( int i)再接着执行 A的构造函数 A( int i),形参 i为12, x被赋值 12;通过对象 b调用其成员函数 dispb(),输出结果 12;接着执行函数 dispb()的第 2条语句输出 2,然后主函数结束。 【知识模块】 继承和派生 21 【正确答案】 C 【试题解析】 此题考查的是派生类的构造与析构。建立派生类的对象时,构造函数的执行顺序如下:执行基类的构造函数,调用顺序按照各个基类被
30、继承时声明的顺序(自左向右)执 行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序一执行自身的构造函数。此题中,执行语句 Derived dl( 3)首先调用基类的构造函数,输出 0;接着调用自身的构造函数输出 3。执行语句Derived d2( 5, 7)时,会调用基类的 Base( n)函数输出 7;然后执行继承类中的 Derived ( int m, int n)的 y( m)输出 5。 【知识模块】 继承和派生 22 【正确答案】 A 【试题解析】 在基类 AA的默认构造函数中,输出字符 l,在继承类 BB的默认构造函数中,输出字符 2,在带有参数 n的构造函数中,输出字符
31、 3。在主函数中,在创建 BB的对象 b( 4)时,会首先调用基类 AA的构造函数输出字符 l,再调用类 BB带参数的构造函数输出字符 3。在创建 BB的对象 c时,会首先调用基类 AA的构造函数输出字符 l,再调用类 BB默认的构造函数输出字符 2。所以程序输出的结果为 1312。 【知识模块】 继承和派生 23 【正确答案】 B 【试题解析】 在主函数中定义 C2类的对象,当程序结束时,首先调用 C2类的析构函数 C2,输出 2,再调用 Cl类的析构函数 Cl,输 出 l。所以程序运行的结果就是 21。 【知识模块】 继承和派生 24 【正确答案】 A 【试题解析】 在主函数中创建类 Derived对象 obj 12( 2, 3)时,因为类Derived是从基类 Base派生而来,所以首先调用基类的构造函数,输出 2,再调用派生类构造函数,输出 3。当主函数运算结果时,首先调用派生类的析构函数,输出 3,再调用基类的析构函数输出 2。所以输出结果为 2332。 【知识模块】 继承和派生 25 【正确答案】 A 【试题解析】 因为派生类从基类中继承,它含有基类中 的数据成员和函数成员,所以当生成派生类对象时,能无条件的调用基类的构造函数。 【知识模块】 继承和派生