1、国家二级 C+机试(继承和派生)模拟试卷 11及答案与解析 一、选择题 1 下列有关继承和派生的叙述中,正确的是 ( )。 ( A)如果一个派生类私有继承其基类,则该派生类对象不能访问基类的保护成员 ( B)派生类的成员函数可以访问基类的所有成员 ( C)基类对象可以赋值给派生类对象 ( D)如果派生类没有实现基类的一个纯虚函数,则该派生类是一个抽象类 2 在类声明中,紧跟在 “public: ”后声明的成员的访问权限是 ( )。 ( A)私有 ( B)公有 ( C)保护 ( D)默认 3 有如下类定义: class XX int xdata; public: XX(int n=0): xda
2、ta(n) ; class YY: public XX int ydata; public: YY(int m=0, int n=0): XX(m), ydata(n) ; YY类的对象包含的数据成员的个数是 ( )。 ( A) 1 ( B) 2 ( C) 3 ( D) 4 4 下列关于基类和派生类关系的叙述中,正确的是 ( )。 ( A)每个类最多只能有一个直接基类 ( B)派生类中的成员可以访问基类中的任何成员 ( C)基类的构造函数必须在派生类的构造函数体中调用 ( D)派生类除了继承基类的成员,还可以定义新的成员 5 当派生类继承一个基类时,默认的继承方式为 ( )。 ( A) pub
3、lic ( B) protected ( C) private ( D)不确定 6 有如下程序: #include using namespace std; class Base public: void fun()coutfun(); ( D) fun(); 7 有如下类定义: class MyBase int k; public: MyBase(int n=0): k(n) int value()constreturn k; ; class MyDerived: MyBase intj; public: MyDerived(int i): j(i) int getK()constretur
4、n k; int getJ()constreturn j; ; 编译时发现有一处语法错误,对这个错误最准确的描述是 ( )。 ( A)函数 getK试图访问基类的私有成员变量 k ( B)在类 MyDerived的定义中,基类名 MyBase前缺少关键字 public、 protected或 private ( C)类 MyDerived缺少一个无参的构造函数 ( D)类 MyDerived的构造函数没有对基类数据成员 k进行初始化 8 有如下类声明: class Base protected; int amount; public; Base(int n=0): amount(n) int
5、getAmount()constretum amount; ; class Derived: public Base protected; int value; public; Derived(int m, int n): value(m) Base(n) Int getData()constreturn value+amount; ; 已知 x是一个 Derived对象,则下列表达式中正确的是 ( )。 ( A) x value+x getAmount() ( B) x getData()-x getAmount() ( C) x getData()-x amount ( D) x valu
6、e+x Amount 9 建立一个有成员对象的派生类对象时,各构造函数体的执行次序为 ( )。 ( A)派生类、成员对象类、基类 ( B)成员对象类、基类、派生类 ( C)基类、成员对象类、派生类 ( D)基类、派生类、成员对象类 10 有如下程序: #include 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
7、n=1: 1 x setN(2); 2 x k=3; 3 x setK(4); 4 return 0; 在标注号码的四条语句中正确的是 ( )。 ( A) 1 ( B) 2 ( C) 3 ( D) 4 11 当派生类从一个基类保护继承时,基类中的一些成员在派生类中成为保护成员,这些成员在基类中原有的访问属性是 ( )。 ( A)任何 ( B)公有或保护 ( C)保护或私有 ( D)私有 12 有如下程序: class Base public: int data; ; class Derivedl: public Base; class Derived2: protected Base; int
8、 main() Derived1 d1; Derived2 d2; d1 data=0: d2 data=0: return 0: 下列关于程序编译结果的描述中,正确的是 ( )。 ( A) 皆无编译错误 ( B) 有编译错误, 无编译错误 ( C) 无编译错误, 有编译错误 ( D) 皆有编译错误 13 有如下程序: #include using namespace std; class A public: A()cout using namespace std; class A public: A(int i)x=i; void dispa()cout using namespace st
9、d; class C1 public: C1()cout using namespace std; class A public: A()cout using namespace std; class Mountain int height; public: Mountain(int h=0): height(h) virtual char*GetName()constreturn“山 “; int GetHeight() constreturn height; ; class Lushan: public Mountain Public: Lushan(int d): Mountain(d)
10、 Char*GetName() constreturn“庐山 “; ; int main() Mountain*p=new Lushan(1000); coutGetName0GetHeight() using namespace std; class Base public: void fun1()cout using namespace std; class Base public: virtual void f()coutf(); P-g(); return 0: 运行时输出的结果是 ( )。 ( A) f+g+ ( B) f0+g+ ( C) f+g0+ ( D) f0+g0+ 22
11、下列有关抽象类和纯虚函数的叙述中,错误的是 ( )。 ( A)拥有纯虚函数的类是抽象类,不能 用来定义对象 ( B)抽象类的派生类若不实现纯虚函数,它也是抽象类 ( C)纯虚函数的声明以 “=0; ”结束 ( D)纯虚函数都不能有函数体 23 在一个抽象类中,一定包含有 ( )。 ( A)虚函数 ( B)纯虚函数 ( C)模板函数 ( D)重载函数 24 下面是类 shape的定义: class Shape public: Virtual void Draw()=0: ; 下列关于 Shape类的描述中,正确的是 ( )。 ( A)类 Shape是虚 基类 ( B)类 Shape是抽象类 (
12、C)类 Shape中的 Draw函数声明有误 ( D)语句 “Shape s; ”能够建立 Shape的一个对象 s 25 有如下程序: #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 No
13、vel(); coutCategory(); return 0; 若程序运行时输出结果是 “文学 ”,则划线处缺失的语句是 ( )。 ( A) char*Category(); ( B) char*Category()const; ( C) virtual char*Category()const; ( D) virtual char*Category()const=0; 26 有如下类定义 class Animal public: virtual void Name()=0; ; class Koala: public Animal public: void Name() *函数体略 * ;
14、 关于上述类定义,下列描述中错误的是 ( )。 ( A)类 Koala是类 Animal的派生类 ( B)类 Koala中的 Name函数是一个虚函数 ( C)类 Animal中的 Name函数是一个纯虚函数 ( D)语句 “Animal a; ”能够建立类 Animal的一个对象 a 国家二级 C+机试(继承和派生)模拟试卷 11答案与解析 一、选择题 1 【正确答案】 D 【试题解析】 此题考查的是继承和派生。无论是哪种继承方式,派生类都能够访问基类的公有和保护成员,而不能访问基类的私有成员,故选项 A和 B错误:公有继承时,基类的对象不可作为派生类的对象处理,即基类对象不可赋值给派生类对
15、象,所以选项 C错误。 【知识模块】 继承和派生 2 【正确答案】 B 【试题解析】 类中提供了 3种访问控制的权限:公有,私有和保护。其中公有类型定义了类的外部接口,任何一个外部的访问都必须通过外部接口进行。私有类型的成员只允许本类的成员函数访问,来自类外部的任何访问都是非法的,保护类型介于公有类型和私有类型之间,在继承和派生时可以体现出其特点。 【知识模块】 继承和派生 3 【正确答案】 B 【试题解析】 因为类 XX包括一个数据成员 xdata,而类 YY继承自类 XX,所在类 YY中也包含数据成员 xdata,同时类 YY中也定义了其本身的数据成员ydata,因而 YY类的对象包含的数
16、据成员的个数是 2。 【知识模块】 继承和派生 4 【正确答案】 D 【试题解析】 继承分为单继承和多继承,一个类只有一个直接基类时,称为单继承;而一个类同时有多个直接基类时,则称为多继承。派生类的数据成员由所有基类的的数据成员与派生类新增的数据成员共同组成。 【知识模块】 继承和派生 5 【正确答案】 C 【试题解析】 派生类继承一个基类时,默认的继承方式为 private。 【知识模块】 继承和派生 6 【正确答案】 B 【试题解析】 此题考查的是继承的使用。分析题目可知,横线处应填入对基类成员函数 fun()的调用语句,此处只能使用作用域运算符 “: ”才能调用到基类的同名函数,故选项
17、B正确。 【知识模块】 继承和派生 7 【正确答案】 A 【试题解析】 此题考查的是派生类对基类成员的访问。因为类中缺省的访问权限是私有,所以本题中 MyBase类中定义的成员 k是私有成员 。派生类中的成员只能访问基类中的公有成员和保护成员,不能访问基类中的私有成员。所以派生类中函数 getK()中的语句 return k;是非法的。 【知识模块】 继承和派生 8 【正确答案】 B 【试题解析】 此题考查的是派生类对基类成员的访问权限。派生类中的成员不能访问基类中的私有成员,可以访问基类中的公有成员和保护成员。派生类从基类公有继承时,基类的公有成员和保护成员在派生类中仍然是公有成员和保护成员
18、:派生类从基类私有继承时,基类的公有成员和保护成员在派生类中都变成私有成员:派生类从基类保护 继承时,基类的公有成员在派生类中变成保护成员,基类的保护成员在派生类中仍然是保护成员。 【知识模块】 继承和派生 9 【正确答案】 C 【试题解析】 建立派生类对象的时候,构造函数的执行顺序如下:执行基类的构造函数,调用的顺序按照基类被继承时候的顺序 (自左向右 )。然后是执行成员对象的构造函数,调用顺序按照各个成员对象在类中的声明顺序 (自上而下 ),最后是执行派生类的构造函数。 【知识模块】 继承和派生 10 【正确答案】 B 【试题解析】 因为类 BB公有继承自类 AA,所以 AA中 的保护成员
19、和公有成员在类 BB中仍是保护成员和公有成员。在选项 B中调用了公有成员函数setN(intn)this-n=n; ,对保护成员 n进行赋值操作。 【知识模块】 继承和派生 11 【正确答案】 B 【试题解析】 基类的公有成员和保护成员只有在以保护继承方式继承时,其在继承类中是保护成员。 【知识模块】 继承和派生 12 【正确答案】 C 【试题解析】 保护继承的类 Dervied2不能访问基类 Base中的公共数据成员data。 【知识模块】 继承和派生 13 【正确答案】 D 【试题解析】 此题考查的是类的继承和派生。系统首先要通过派生类的构造函数调用基类的构造函数,对基类成员初始化;然后对
20、派生类中的新增成员初始化。 【知识模块】 继承和派生 14 【正确答案】 A 【试题解析】 此题考查的是派生类对象的析构。释放派生类对象时,析构函数的执行顺序是:首先调用派牛类自身的析构函数:然后调用类成员对象的析构函数:最后调用基类的析构函数。所以四个选项中只有选项 A正确。 【知识模块】 继承和派生 15 【正确答案】 C 【试题解析】 此题考查的是派生类的构造。主函数中,首先声明 B类的对象 b,执行进入 B的构造函数 B(int i)再接着执行 A的构造函数 A(int i),形参 i为 12, x被赋值 12;通过对象 b调用其成员函数 dispb(),输出结果 12;接着执行函数d
21、ispb()的第 2条语句输出 2,然后主函数结束。 【知识模块】 继承和派生 16 【正确答案】 B 【试题解析】 在主函数中定义 C2类的对象,当程序结束时,首先调用 C2类的析构函数 C2,输出 2,再调用 C1类的析构函数 C1,输出 1。所以程序运行的结果就是 21。 【知识模块】 继承和派生 17 【正确答案】 B 【试题解析】 根据派生类构造函数的一般格式: (): (), (), (), ()。在派生类 BB的构造函数总参数表后面应该接上基类名 AA和其参数。 【知识模块】 继承和派生 18 【正确答案】 B 【试题解析】 派生类 B是由基类 A公开继承而来,所以在创建类 B的
22、 obj对象时,首先执 行基类 A的构造函数 A(),输出 A,再执行派生类 B的构造函数 B(),输出 G,当程序结束时,首先执行派生类的析构函数 B(),输出 T,再执行基类A的析构函数 A(),输出 C。 【知识模块】 继承和派生 19 【正确答案】 A 【试题解析】 在基类 Mountain中定义了虚函数 GetName()输出字符串 “山 ”,而在派生类 Lushan中对虚函数 GetName()进行了重新定义,输出字符串 “庐山 ”。在主函数中对派生类中的虚函数 GetName()进行了多态调用,此时调用的是派生类中重新定义的 GetName(),输出字符字符串 “庐山 ”。 【知
23、识模块】 继承和派生 20 【正确答案】 B 【试题解析】 此题考查的是虚函数的概念。在 C+语言中,一个派生类的对象可以被它的任何一个基类的指针所指向,若基类和派生类中存在模一样的成员函数。那么通过该基类指针调用这样的成员函数时,若这个成员函数被定义成虚函数,那么就调用派生类中的;否则就调用基类中的。本题中,在 f()函数中,形参b是一个基类的引用,它引用的是主函数中定义的派生类对象 obj,所以在调用fun1()时,运行的是基类的版本,而 fun2()运行的是派生类的版本。 【知识模块】 继承和派生 21 【正确答案】 C 【试题解析】 此题考查的是虚函数和多态性。此题中,因为 f()是虚
24、函数具有多态性,所以通过指针 p调用的 f()是派生类 Derived中定义的 f():而 g()不是虚函数,通过指针 p调用的是 Base中的 g()。 【知识模块】 继承和派生 22 【正确答案】 D 【试题解析】 此题考查的是抽象类和纯虚函数的概念。纯虚函数可以有函数体,它的实现由派生类给出。 【知识模块】 继承和派生 23 【正确答案】 B 【试题解析】 拥有纯虚函数的类叫做抽象类,所以抽象类中必然包含有虚函数。 【知识模块】 继承和派生 24 【正确答案】 B 【试题解析】 因为类 Shape中包含纯虚函数 Draw(),所以类 Shape是抽象类。 【知识模块】 继承和派生 25 【正确答案】 D 【试题解析】 根据程序运行的结果为:文学,说明程序执行了派生类 Novel中的成员函数 *Category()constreturn“文学 “; ,所以在基类 Book中要把函数*Categorv()const定义为 纯虚函数。 【知识模块】 继承和派生 26 【正确答案】 D 【试题解析】 在类 Animal定义了纯虚函数 Name(),所以类 Animal就是一个抽象类,而抽象类是不能够建立对象的。 【知识模块】 继承和派生
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1