1、国家二级( C+)笔试模拟试卷 74及答案与解析 1 下列叙述中,正确的是 ( )。 ( A)非空循环队列的队尾指针等于排头指针时,也可以进行入队运算 ( B)循环队列为空时可以进行退队运算 ( C)退队运算后队列长度减 1 ( D)入队运算就是将新元素插入到队尾指针指向的位置 2 下列叙述不属于线性链表较之线性表顺序存储结构的优点的是 ( )。 ( A)线性链表存储方式简单 ( B)线性链表运算效率高 ( C)线性链表的存储空间易于扩展 ( D)线性链表便于存储空间的动态分配 3 设有下列 二叉树 (如下图所示 )对此二叉树中序遍历的结果是 ( )。 ( A) ABDGCEHIF ( B)
2、DGBAHEICF ( C) GDBHIEFCA ( D) ABCDEFGHI 4 若要求尽可能快地对实数数组进行稳定的排序,则应选 ( )。 ( A)快速排序 ( B)堆排序 ( C)归并排序 ( D)基数排序 5 在所有排序方法中,关键字比较的次数与记录的初始排列次序无关的是 ( )。 ( A)希尔排序 ( B)冒泡排序 ( C)插入排序 ( D)选择排序 6 函数重载是指 ( )。 ( A)两个或两个以上的函数取相同的函数名,但形参的个数或类型不同。 ( B)两个以上的函数取相同的名字和具有相同的参数个数,但形参的类型可以不同。 ( C)两个以上的函数名字不同,但形参的个数或类型相同。
3、( D)两个以上的函数取相同的函数名,并且函数的返回类型相同。 7 下面关于对象的描述中正确的是 ( )。 ( A)任何对象都必须具有继承性 ( B)任何对象都必须具有多态性 ( C)操作是对象的静态属性 ( D)对象间的通信靠消息传递 8 在关系代数中,对一个关系投影操作以后,新关系的元组个 数跟原来关系的元组个数相比 ( )。 ( A)小于 ( B)小于或等于 ( C)等于 ( D)大于 9 关系数据库的概念模型是 ( )的集合。 ( A)关系模型 ( B)关系模式 ( C)关系子模式 ( D)存储模式 10 如果对一个关系实施了一种关系运算后得到了一个新的关系,而且新的关系中属性个数少于
4、原来关系中属性个数,这说明所实施的运算关系是 ( )。 ( A)选择 ( B)投影 ( C)连接 ( D)并 11 要把高级语言编写的源程序转换为目标程序,需要使用 ( )。 ( A)编辑程序 ( B)驱动程序 ( C)调试程序 ( D)编译程序 12 以下选项中,合法的字符常量是 ( )。 ( A) N ( B) 010 ( C) 68 ( D) D 13 定义如下枚举类型: enumMonday, Tuesday, Wednesday, Thursday,Friday=2; 则下列语句正确的是 ( )。 ( A)表达式 Wednesday=Friday的值是 true ( B) Dayda
5、y; day=3; ( C) Dayday; day=Monday+3; ( D) Dayday; day=Tuesday+10; 14 下列 for循环执行的次数为 ( )。 for(int i=0, j=10; i=j=10; i+, j-) ( A) 0 ( B) 11 ( C) 10 ( D)无数次 15 下列关于 goto语句的描述中,正确的是 ( )。 ( A) goto语句可在一个文件中随意转向 ( B) goto语句后面要跟一个它所转向的语句 ( C) goto语句可以同时转向多条语句 ( D) goto语句可以从一个循环体内转到循环体外 16 若有定义: int*p; 则下列
6、各选项中,不同于表达式 “*p=*p+1; ”的是 ( )。 ( A) *p+; ( B) +*p; ( C) *p+=1; ( D) +(*p); 17 下列数组的定义中,会产生错误的是 ( )。 ( A) int a=0,1,2,3,4,5,6; ( B) int a10=0,1,2,3,4,5,6; ( C) char a5=“hello“; ( D) char a5=h,e,1,1,o; 18 在 C+语言中,函数形参的默认存储类型是 ( )。 ( A) auto ( B) register ( C) static ( D) extem 19 下面类的定义,有 ( )处错误。 clas
7、s MyClass public: void MyClass(); MyClass(int Value); private: int i=0; ; ( A) 1 ( B) 2 ( C) 3 ( D) 4 20 下列关于多继承二义性的描述中,错误 的是 ( )。 ( A)一个派生类的两个基类中都有某个同名成员,在派生类中对这个成员的访问可能出现二义性。 ( B)解决二义性的最常用的方法是对成员名的限定法 ( C)基类和派生类中同时出现的同名函数,也存在二义性问题 ( D)一个派生类是从两个基类派生出来的,而这两个基类又有一个共同的基类,对该基类成员进行访问时,可能出现二义性 21 以下程序的功能
8、是:按顺序读入 10名学生 4门课程的成绩,计算出每个学生的平均分数并输出,程序如下: #include iostream using namespace std; int main( ) int n, k; float score, sum, ave; sum = 0.0; for(n = 1; n =10; n+) for(k =1; k =4; k+) cinscore; sum += score; ave=sum/4.0; cout“NO “ n “ave: “ ave end1; return 0; 上述程序运行后结果不正确,调式中发现有一条语句出现在程序中的位置不正确。 这条语句是
9、非曲直 ( )。 ( A) sum=0.0; ( B) sum+=score; ( C) ave= sum/4.0 ( D) cout “NO.“ n “ave:“ ave end1; 22 有以下程序: #include iostream using namespace std; char *x=“First“, “Second“, “Third“ ; void f(char *z ) cout *z+end1; int main ( ) char *y; y=x; f(y); return 0; ( A)产生语法错误 ( B) First ( C) Secpnd ( D) Third 23
10、 以下程序的输出结果是 ( )。 #include iostream using namespace std; int f(int b,int m, int n) int i,s = O; for(i = m;i n;i+=2) s+=b i; return s; int main ( ) int x a = 1,2,3,4,5,6,7,8,9; x = f(a,3,7); cout x end1; return 0; ( A) 10 ( B) 18 ( C) 8 ( D) 15 24 有以下程序: #include iostream using namespace std; class My
11、Class int m; publ i c: static int n; MyClass ( ) m = 0; void setvalue() m+; n+; void output () cout“m=“ m , n=“ n end1; ; int MyClass : n=0; int main() MyClass obj1, obj2; obj1.setvalue(); objl.output(); obj2.setvalue(); obj2.output(); return 0; ( A) m= 1 ,n= 1 换行 m= 1 ,n=1 ( B) m= 1 ,n= 1 换行 m=1 ,n
12、=2 ( C) m=1,n=1换行 m=2,n=1 ( D) m=1,n=1换行 m=2,n=2 25 有以下程序: #include iostream using namespace std; class Point public: void SetPoint(int x,int y); void Move(int xOff,int yOff); int GetX() return X; int GetY() return Y; private: int X,Y; ; void Point:SetPoint(int x, int y) X=x; Y=y; void Point: :Move(
13、int xOff, int yOff) X+=xOff; Y+=yOff; int main () Point p1; p1.SetPoint(1,2); p1.Move (5, 6); cout“Point1 is (“ p1.GetX() , p1.GetY() “)“ end1; return 0; 执行后的输出结果是 ( )。 ( A) Point1 is (6,8) ( B) Point1 is (1,2) ( C) Point1 is (5,6) ( D) Point1 is (4,4) 26 为使下列程序的正确输出结果为: Now is 2004-7-6 12:12:12 那么应
14、该在程序划线处填入的语句是 ( )。 #include iostream using namespace std; class TIME; class DATE public: DATE(int y=2004,int m=1,int d=1) year=y; month=m; day=d; void DateTime(TIME private: int year,month, day; ; class TIME public: TIME(int h=0,int m=0,int s=0) hour=h; minute=m; second=s; _; /将类 DATE 中成员函数 DateTime
15、 声明为类 TIME 的友元函数 private: int hour,minute, second; ; void DATE: :DateTime(TIME int main ( ) DATE d(2004,7,6); TIME t (12, 12, 12); d. DateTime (t); return 0; ( A) friend void DateTime(TIME ( B) friend void DATE:DateTime(TIME ( C) void DateTime(TIME ( D) friend void DateTime(TIME 27 设有如下程序: #include
16、iostream using namespace std; class A public: int i; display() cout “class An“; ; class B public: int i; display() cout “class Bn“; ; class C : public A, public B int j; public: int i; show ( ) j = i * i; display(); ; int main() C demo; demo.show(); return O; 则主程序运行时将 ( )。 ( A)因为变量 i的重复定义而报错 ( B)因为对
17、象 demo间接调用 display()函数时产生二义性而报错 ( C)因为类定义的语法错误而不能运行 ( D)没有语法错误,能够正常输出结果 28 有如下程序: #include iostream using namespace std; class base public: virtual void f1() cout “F1Base“; virtual void f2() cout “F2Base “; ; class derive : public base void f1 ( ) cout “F1Derive“; void f2( int x ) cout “F2 Derive“;
18、; int main () base objl, * p; derive obj2; p = p - f1(); p - f2(); return 0; 执行后的输出结果是 ( )。 ( A) F1Derive F2Base ( B) F1Derive F2Derive ( C) F1Base F2Base ( D) F1Base F2Derive 29 有如下程序: #include iostream.h class x protected: int a; public: x() a=1; ; class x1 : virtual public x public: x1() a+=1; co
19、ut a; ; class x2 : virtual public x public: x2() a+=2; cout a; ; class y : public xl,public x2 public: y() cout a end1; ; int main() y obj; return O; 该程序运行后的输出结果是 ( )。 ( A) 1 ( B) 123 ( C) 242 ( D) 244 30 下列关于 getline() 函数的描述中,不正确的是 ( )。 ( A) getline()函数是用来从键盘上读取字符串的 ( B) getline()函数读取字符串长度是受限制的 ( C
20、) getline()函数读取字符串时,遇到终止符时就停止 ( D) getline()函数中所使用的终止符只能是换行符 31 对于长度为 n的线性表,若进行顺序查找,则时间复杂度为【 】。 32 已知某序列为 49, 38, 65, 97, 76, 13, 27,试采用该序列的第一个元素为枢轴进行快速排序,则经过 一趟快速排序之后所得到的序列为:【 】。 33 在选择运算所得到的结果关系中,所含的元组数不合【 】原关系中的元组数。 34 当输入 10, 11, 12时,下面程序运行结果是【 】。 #include iostream using namespace std; int main(
21、) int a,b,c,max; cin a b c; max=a; if (max B) max=b; if (max C) max=c; cout max end1; return 0; 35 求 1 100的和,可写成 “for(s=0,i=1;【 】; i+) s+=i; ”的形式。 36 以下程序调用 findmax()函数返回数组中的最大值。请填空完成此函数。 #include iostream using namespace std; int findmax(int*a, int n) int +p、 *s; for(p=a, s=a; p-a n; p+) if(【 】 ) *
22、s=*p; return(*S); int main() int x5=12, 21, 14, 16; cout findmax(X, 5) end1; return 0; 37 下面程序的输出结果是【 】。 #include iostream using namespace std; void f(int x) if(x) cout put(0+x%10); f(x 10); int main() f(11001); return 0; 38 非成员函数只有在声明为类的【 】才能访问这个类的所有 private成员。 39 有一种特殊的虚函数,重定义时不要求同名,这种虚函数是【 】。 40
23、cout是 I O流库预定义的【 】。 41 以下程序实现栈的入栈和出栈的操作。其中有两个类:一个是节点类 node,它包含点值和指向上一个节点的指针 prev;另一个类是栈类 stack, 它包含栈的头指针 top。 生成的链式栈如下图所示。 IMG onClick=over(this) title=放大 src=“tp/jsj/2jc+j28.1.gif“ 下面是实现程序,请填空完成此程序。 #include iostream using namespace std; class stack; class node int data; node *prev; public: node(in
24、t d, node *n) data=d; prev=n; friend class stack; ; class stack node *top; /栈头 public: stack() top=0; void push(int i) node *n=【 】 ; top=n; int pop() node *t=top; if (top) top=top- prev; int c= t- data; delete t; return c; return 0; int main () stack s; s.push(6); s.push(3); s.push (1); return 0; 42
25、 在下面的程序的横线处填上适当的语句,使该程序的输出为 12。 #include iostream using namespace std; class Base public: int a; Base(int i) a=i; ; class Derived : public Base int a; public: Derived(int x) : Base(x),b(x+1) void show() 【 】 ; /输出基类数据成员 a的值 cout b end1; ; int main() Derived d(1); d.show(); return 0; 43 若有以下程序: #inclu
26、de iostream using namespace std; class Base public: Base ( ) x=0; int x; ; class Derived1 : virtual public Base public: Derived1() x=10; ; class Derived2 : virtual public Base public: Derived2() x=20; ; class Derived : public Derived1,protected Derived2 ; int main() Derived obj; cout obj.x end1; ret
27、urn 0; 该程序运行后的输出结果是【 】。 44 若有 0 9之间不同的 3个数构成一个三位数,下面程序将统计出共有多少种方法,请填空完成此程序。 #include iostream using namespace std; int main ( ) int i,j,k; for(i = 1;i =9;i+) for (j=O; j =9; j+) if(【 】 ) continue; else for(k = 0;k =9;k+) if(【 】 ) count+; cout count end1; return 0; 国家二级( C+)笔试模拟试卷 74答案与解析 1 【正确答案】 C
28、【试题解析】 非空循环队列的队尾指针等于排头指针时,说明循环队列已满,不能进行入队运算,选项 A是错误的。循环队列为空时不可以进行退队运算,否则产生 “下溢 ”,选项 B是错误的。入队运算首先将队尾指针进 1,然后将新元素插入到队尾指针指向的位置。 2 【正确答案】 A 【试题解析】 线性链表存储方式要求每个数据节点由两个部分组成,比线性表的顺序存储结构复杂,选项 A是错误的。在平均情况下,线性表的顺序存储结构插入和删除元素需要移动线性表中约一半的元素,效率低下。而线性链表只需改变有关节点的指针,效率较高,选项 B是正确的。线性表的顺序存储存储空间必须是连续的,不利于存储空间扩展;而线性链表不
29、需要连续的 存储空间,存储空间易于扩展,选项 C是正确的。为保证线性表的存储空间连续且顺序分配,会导致在对某个线性表进行动态分配存储空间时,必须要移动其他线性表中的数据元素,不便于存储空间的动态分配,选项 D是正确的。 3 【正确答案】 B 【试题解析】 选项 A、 D中,根节点排在最前,因此可以断定不是中序遍历。选项 C中,根节点排在最后,因此也可以断定不是中序遍历。其中选项 A、 C分别为前序遍历和后序遍历的结果。 4 【正确答案】 C 【试题解析】 这里要用到的知识几乎都是要记忆的。此类题目可以采用排除法 ,首先,稳定的排序这里有两个选项 C和 D,其饮,选项 D不适用于实数的排序,因此
30、只可用 C。 5 【正确答案】 D 【试题解析】 希尔排序和冒泡排序都属于插入排序,它们通过数据元素的交换来逐步消除线性表中的逆序,所以关键字比较的次数与记录的初始排列次序有关。而选择排序是指扫描整个线性表,从中选出最小的元素,将它交换到表的前面。然后对剩下的字表采用同样的办法,所以关键字比较的次数与记录的初始排列次序无关。 6 【正确答案】 A 【试题解析】 函数重载指的是两个或两个以上的函数具有相同的函数名,但 是形参的个数或类型不同。程序中通过判断主调函数传过来的参数的个数和类型来决定选择调用哪个具体的函数。 7 【正确答案】 D 【试题解析】 继承性和多态性是对象支持的特性,并不是必须
31、具备的条件。操作是对象的动态性属性。 D选项的描述是正确的。 8 【正确答案】 C 【试题解析】 本题考核对投影运算的掌握。投影操作是从表中选出某些列而丢弃另一些列。如果只对一个关系中的某些属性感兴趣,那么就需要在这些属性上使用投影操作投影该关系,而元组个数是指一个表中的行的数目,因此,对一个关系投影操作以后,新 关系的元组个数跟原来关系的元组个数相等。 9 【正确答案】 B 【试题解析】 本题考核关系数据库的概念模型。数据库的概念模型体现了数据之间的关系,它是各种数据之间相互关系的集合。关系数据库的概念模型是关系模式的集合。关系子模式是指关系数据库模式中用户所见到的那部分数据模式描述。 10
32、 【正确答案】 B 【试题解析】 本题考核对几种关系代数运算的掌握。其中选择和投影的区别在于:如果将一个关系看作一张表,那么选择操作就是从这张表中选出一些行而丢弃另一些行。而投影操作则是从这张表中选出某些列而 丢弃另一些列。如果只对一个关系中的某些属性感兴趣,那么就需要在这些属性上使用投影操作投影该关系。并操作的结果表示为 Rus,它是一个关系,包括或者在 R中、或者在 S中、或者同时在 R和 S中的所有元组,新的关系中属性个数多于原来关系中属性个数。连接操作用于将两个关系中的相关元组组合成单个元组。 11 【正确答案】 D 【试题解析】 C+是以编译方式实现的高级语言。 C+程序的实现必须要
33、使用某种 C+语言的编译器进行编译。编译器的功能是将程序的源代码 (.cpp)转换为机器代码的形式,称为目标代码 (.obj);然后,再使用目标代码进行链接,生成可执行文件 (.exe),等待下一步的执行过程。 12 【正确答案】 B 【试题解析】 本题考核字符型常量的表示。选项 A中是字符串的表示方法。选项 B所表示的是一个转义字符,是特殊的字符常量。选项 C中所表示的是整型常量。选项 D中不是常量的表示。 13 【正确答案】 A 【试题解析】 本题考查枚举类型的定义和使用。枚举类型定义了一些整型符号常量的集合,使用枚举类型时应该注意以下几点; 枚举类型的第一个常量默认值是 0。 枚举类型常
34、量的值允 许彼此相同。 虽然枚举类型常量是整数类型,但是不允许使用整数直接赋值给枚举类型变量,也不允许与整数进行运算,只可以与整数进行比较。 根据以上知识,我仃何以得出选项 B、 C、 D都不正确。 14 【正确答案】 D 【试题解析】 本题考核 for循环。 for语句的循环条件部分为 “i=j=10”,这是一个赋值表达式,永远为真,即 for循环是死循环,将执行无数次。 15 【正确答案】 D 【试题解析】 goto语句也可以跳出循环和 switch语句, goto语句无条件地转移程序的执行控制。 它总是与一标号相匹配,其形式为: goto标号;,标号是用户自定义的标识符,它可以处于 go
35、to语句的前面,也可以处于其后,但标号必须与goto语句处于同一个函数中。定义标号时,由一个标识符后面跟一个冒号组成。 16 【正确答案】 A 【试题解析】 题目中的语句 “*p=*p+1; ”是将指针变量 p所指向的存储单元的值加 1,然后再放入 p所指向的存储单元中。选项 A中,语句 “*p+; ”,当把该表达式赋给一整型变量 k时,就会发现,原语句可变为 “k=*p; p=p+1; ”,即语句“*p+”最后所执行的是 p的值 (即 p中存放的地址 )加 1,与题中语句 “*p=*p+1; ”的意思不同。再来看选项 B, C, D,选项 B中的语句可表示为 “*p=*p+1; ”。选项 C
36、中的语句可表示为 “*p=*p+1; ”。选项 D中的语句也可表示为 “*p=*p+1; ”。 17 【正确答案】 C 【试题解析】 本题考核数组的定义以及字符串数组方面的基础知识。下面逐项进行分析:选项 A中,数组 a的定义和初始化符合数组的定义和初始化语法,故正确:选项 B中,数组 a初始化的值虽然没有 10个,但对于少的部分,系统会自动补 0,所以选项 B中数组的定义也是正确;选 项 C中,数组 a的长度为 5,但字符串 “hello“,的长度为 5+1=6,字符串结束符, 10,无法存储在数组中,所以是错误的;选项 D中,数组 a的定义是正确的。 18 【正确答案】 A 【试题解析】
37、在函数内部或复合语句内定义变量时,如果没有指定的存储类型或使用了 auto说明符,系统就认为所定义的变量具有自动类别。 19 【正确答案】 C 【试题解析】 该类的定义共有 3处错误。 类的成员变量不能在定义时进行初始化: 类的构造函数不能有返回值 (包括 void类型 ); 类的析 构函数不能有参数。 20 【正确答案】 C 【试题解析】 本题考核多继承中出现的二义性问题。在多重继承的情况下,派生类具有两个以上的直接基类,而这些直接基类的一部分或全部又是从另一个共同基类派生而来时,这些直接基类中从上一级继承来的成员就拥有相同的名称。在派生类的对象中,这些同名成员在内存中同时有多个复制件,所以
38、派生对这些同名成员的访问存在二义性。所以选项 A和 D的说法是正确的。 解决二义性的方法有两种:一是使用作用域分辨符来惟一标识并分别访问它们:二是可以将共同基类设置为虚基类。而第一种方法 最常用。所以选项 B的说法是正确的。 基类和派生类中同时出现同名函数,符合支配规则,不存在二义性问题。所以选项 C的说法不正确。 21 【正确答案】 A 【试题解析】 本题中 sum用来保存每位学生的总成绩,所以在计算不同学生的总成绩时,应将 sum重新赋值初值 0,即语句 “sum=0.0; ”应该包含在第 1个 for循环体内,并在第 2个 for语句前执行。 22 【正确答案】 B 【试题解析】 程序首
39、先定义全局指针数组 x,并赋初值。在函数 f()中,语句“cout *z+ end1; ”是输出 *z指向的字符串,然后指向下一个指针。由于在主函数中,指针 y已初始化指向指针数组 x,所以执行 f(y)后,程序输出指针数组 x中的第一个字符串 “First“。 23 【正确答案】 A 【试题解析】 本题考查对数组以及数组作为函数参数的掌握程度。本题通过参数传递将数组 a传给 f()函数中的数组 b,并由 s传递返回值给主函数中的 x。主函数中, x=f(a,3,7),即把数组 a传给 f()函数中的数组 b,把 3传给 m,把 7传给 n。所以函数 f()中的 for循环中,是从 3开始循环
40、,经过两次循环后,实现 a3和 a5值的累加,并存入 s中,然后返回给主函数中的 x。所以 x的值为 10。 故本题答案是 A。 24 【正确答案】 B 【试题解析】 本题考核静态数据成员的应用。类中的数据成员 n为静态变量,这种类型变量采用静态存储分配。当函数执行完后,返回调用点,该变量并不撤销,其值将继续保留。内部静态变量有隐含初始值 0,并且只在编译时初始化一次。而类中的数据成员 m为 auto变量,每次程序退出其作用域时将自动消失。所以其值不能保留下来。 25 【正确答案】 A 【试题解析】 本题考核对象的定义与使用。程序中定 义了一个类 Point,在主函数中定义了一个 Point类
41、的对象 p1,然后通过对象 p1调用其成员函数 SetPoint()和 Move()实现移位的操作。 26 【正确答案】 B 【试题解析】 根据要求可知,在横线处是将类 DATE中成员函数 DateTime声明为类 TIME的友元函数。由于函数 DateTime是类 DATE的成员函数,因此对DateTime函数的使用要加上 “DATE: ”修饰。其他各声明的组成部分可参照函数 DateTime在类体外的定义实现。 27 【正确答案】 B 【试题解析】 本题主要考察 C+中多继承的工作方式和二义性的解决办法。在C+中,允许一个派生类从多个基类派生,这种继承方式称为多继承。多继承的定义格式如下:
42、 class派生类名:继承方式基类名 1,继承方式 2基类名 2, 派生类类体 ; 但是,如果一个派生类的两个或多个基类中有某个同名成员,在派生类中对这个成员的访问就可能出现二义性;同时,如果一个派生类是由两个或多个基类派生出来的,而这几个基类又有一个共同的基类,对该基类进行访问时,也可能会出现二义性。本题程序中,类 C是由类 A和类 B多继承得到的派生类,但其自身函数 show()中调用了 display()函数,而这个函数是同时出现在类 C的两个基类中的,因此程序会出现二义性,编译器将无法确定调用哪一个 display()函数来执行操作,因此报错。 解决二义性的通常办法是通过作用域运算符
43、“:”进行限定。 28 【正确答案】 A 【试题解析】 本题主要考察 C+中虚函数机制及其继承过程中的要点。虚函数在基类中加关键词 virtual声明,在派生类中重新定义。如果派生类没有覆盖虚函数,则程序执行中将会执行基类的虚函数版本。 本题程序中,建立了基类 base,其内函数 void f1()和 void f2()均被声明为虚函数,并在调用时会显式地发出声明。派生类 derive利用 public方式继承基类base,并覆盖其基类 base中的虚函数 f1()。对于 base中的虚函数 f2(),由于派生类 derive中的同名函数 f2()中带有参数 int x,因此被编译器认为是函数
44、重载,而不作虚函数覆盖处理,所以实际上派生类 derive中包含两个 f2()函数,一个不带参数,调用时执行基类 base中的 f2()函数版本,一个带参数 int x,调用时执 行重载后的版本。 本题主函数中,定义了基类对象。 obj1和基类指针 *p,同时定义了派生类对象。 obj2。 p指向 obj2时, “p- n()”函数调用执行派生类覆盖后的版本,输出 F1Derive;“p- f2()”由于不带参数,因此执行未经派生类覆盖的函数版本,即基类 base中的 f1()函数版本。 29 【正确答案】 D 【试题解析】 本题程序中引入了虚基类。在主函数 main中,执行语句 “y obj; ”时,先执行虚基类 x的构造函数,使 a=1;然后执行类 x1的构造函数,使 a=2,并输出 值 2;再执行类 x2的构造函数,使 a=4,并输出值 4;最后执行类 y的构造函数,输出值 4。 30 【正确答案】 D 【试题解析】 本题主要考察 C+中输入流成员函数的使用。输入流的成员函数主要包括 open()、 get()、 getline()、 read()、 seekg()、 tellg()和 close()等函数。其中,getline()函数从输入流中读取多个字符,并且允许指定输入终止符,其原形