1、国家二级 C+机试(继承和派生)模拟试卷 3及答案与解析 一、选择题 1 有如下类声明: class XA int x; public: XA(int n)x=n; ; class XB: public XA int y; public: XB(int a, int b); ; 在构造函数 XB的下列定义中,正确的是 ( )。 ( A) XB: XB(int a, int b): x(a), y(b) ( B) XB: XB(int a, intb): xA(a), y(b) ( C) XB: XB(int a, int b): x(a), XB(b) ( D) XB: XB(int a, i
2、nt b): XA(a), XB(b) 2 下列有关类继承的叙述中,错误的是 ( )。 ( A)继承可以实现软件复用 ( B)虚基类可以解决由多继承产生的二义性问题 ( C)派生类构造函数要负责调用基类的构造函数 ( D)派生类没有继承基类的私有成员 3 定义派生类时,若不使用关键字显式地规定采用何种继承方式,则默认方式为( )。 ( A)私有继承 ( B)非私有继承 ( C)保护继承 ( D)公有继承 4 下列关于继承方式的描述中,错误的是 ( )。 ( A)如果不显式地指定继承方式,缺省的继承方式是私有 (private) ( B)采用公有继承方式时,基类中的公有成员在派生类中仍然是公有成
3、员 ( C)采用保护继承方式时,基类中的保护成员在派生类中仍然是保护成员 ( D)采用私有继承方式时,基类中的私有成员在派生类中仍然是私有成员 5 若已定义了类 Vehicle,则下列派生类定义中;错误的是 ( )。 ( A) class Car: vehicle *类体略 * ; ( B) class Car: public car *类体略 * ; ( C) class Car: public Vehicle *类体略 * ; ( D) class Car: virtual public Vehicle *类体略 * ; 6 下列关于派生类的叙述中,错误的是 ( )。 ( A)派生类至少要
4、有一个基类 ( B)派生类中包括了从基类继承的成员 ( C)一个派生类可以作为另一个派生类的基类 ( D)基类成员被派生类继承以后访问权限保持不变 7 有如下程序: #include iostream using namespace std; class Base private: void fun1() constcout “fun1“; protected: void fun2() constcout “fun2“; public: void fun3() constcout “fun3“; ; class Derived: protected Base public: void fun4
5、() corotcout “fun4“; ; int main() Derived obj; obj fun4(); obj fun2(); obj fun3(); obj fun4(); return 0; 其中有语法错误的语句是 ( )。 ( A) ( B) ( C) ( D) 8 派生类的成员函数不能访问基类的 ( )。 ( A)公有成员和保护成员 ( B)公有成员 ( C)私有成员 ( D)保护成员 9 在一个派生类的成员函数中,试图调用其基类的成员函数 “void f(); ”,但无法通过编译。这说明 ( )。 ( A) f()是基类的私有成员 ( B) f()是基类的保护成员 (
6、C)派生类的继承方式为私有 ( D)派生类的继承方式为保护 10 有如下类定义和变量定义: class Parems public: int publicData; private: int privateData; ; 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 public
7、Data endl; ( D) cout b privateData endl; 11 有如下两个类定义 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 12 下列关于派生类和基类的描述中,正确的是 ( )。 ( A)派生类成员函数只
8、能访问基类的公有成员 ( B)派生类成员函数只能访问基类的公有和保护成员 ( C)派生类成员函数可以访问基类的所有成员 ( D)派生类对基类的默认继承方式是公有继承 13 有如下程序: #include 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 getX() endl; return 0; 运行这个 程序的输出结果是 ( )。 ( A) 3 ( B) 4 ( C) 7 ( D) 10 14 有如下程序: #include iostream using namespace std; class A public: A()cout “A“; A()cout “ A“; ; class B: public A A* p; public: B()cout “B“; p=new A(); B()cout “ B“; deletep; ; int main() B obj; r
10、eturn 0; 执行这个程序的输出结果是 ( )。 ( A) BAA B A ( B) ABA B A A ( C) BAA B A A ( D) ABA A B A 15 下列关于派生类构造函数和析构函数的说法中,错误的是 ( )。 ( A)派生类的构造函数会隐含调用基类的构造函数 ( B)如果基类中没有缺省构造函数,那么派生类必须定义构造函数 ( C)在建立派生类对象时,先调用基类的构造函数,再调用派生类的构造函数 ( D)在销毁派生类对象时,先调用基类的析构函数,再调用派生类的析构函数 16 有如下程序: #include iostream using namespace std; c
11、lass Base int x; public; Baseint n=0); x(n)cout n; Int getX()constreturn x; ; class Derived public Base int y; public; Derived(int m, int n): y(m), Base(n)cout m; Derived(int m): y(m)cout m; ; int main() Derived d1(3), d2(5, 7); Return 0; 运行时的输出结果是 ( )。 ( A) 375 ( B) 357 ( C) 0375 ( D) 0357 17 有如下程序
12、: #include 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 valD; private: int valD; ; int main() Derived obj12(2, 3); retur
13、n 0; 运行时的输出结果是 ( )。 ( A) 2332 ( B) 2323 ( C) 3232 ( D) 3223 18 有如下程序: #include iostream using namespace std; class Basel public: Base1(int d)cout d; Base1() ; class Base2 public: Base2(int d)cout d; Base2() ; class Derived: public Base1, Base2 public: Derived(int a, int bint c, int d); Base1(b), Bas
14、e2(a), b1(d), b2(c) Private: int b1; int b2; ; int main() Derived d(1, 2, 3, 4); return 0; 运行时的输出结果是 ( )。 ( A) 1234 ( B) 2134 ( C) 12 ( D) 21 19 有如下程序: #include iostream using namespace std; class Base public: void fun()cout B; ; class Derived: public Base public: void fun()_cout D; ; int main() Der
15、ived d; d fun(); return 0; 若程序的输出结果是 BD,则划线处缺失的部分是 ( )。 ( A) fun(); ( B) Base fun(); ( C) Base: fun(); ( D) Base- fun(); 20 在 C+中,用于实现运行时多态性的是 ( )。 ( A)内联函数 ( B)重载函数 ( C)模板函数 ( D)虚函数 21 有如下程序 #include iostream using namespace std; class A public: virtual void func1()cout “A1“; void func2()cout “A2“;
16、 ; class B: public A public: void func1()cout “B1“; void func2()cout “B2“; ; int main() A *p-new B; p- func1(); p- func2(); return 0; 运行此程序,屏幕上将显示输出 ( )。 ( A) B1B2 ( B) A1A2 ( C) B1A2 ( D) A1B2 22 有如下程序; #include iostream using namespace std; class Base public: void output()cout 1; virtual void Prin
17、t()cout B; ; class Derived: public Base public: void output()cout 2; void Print()cout D; ; int main() Base *ptr=new Derived; ptr- output(); ptr- Print(); delete ptr; return 0; 程序的输出结果是 ( )。 ( A) 1B ( B) 1D ( C) 2B ( D) 2D 23 有如下程序: #include iostrearn using namespace std; class GA public; virtual int
18、 f()return 1; ; class GB: public GA publiC; virtual int f()return 2; ; void show(GA g)cout g f(); void display(GA &g)cout g f(); int main() GA a: show(a); display(a); GB b: show(b); display(b); return 0; 运行时的输出结果是 ( )。 ( A) 1111 ( B) 1211 ( C) 1112 ( D) 1212 24 有如下程序: #include iostream using namespa
19、ce std; class A public: virtual void f()cout 1; void g()cout 2; ; class B: public A public: virtual void f()cout 3; void g()cout 4; ; void show(A &a)a f(); a g(); int main() B b; show(b); return 0; 运行时的输出结果是 ( )。 ( A) 12 ( B) 34 ( C) 14 ( D) 32 25 有如下程序: #include iostream using namespace std; class
20、B public: B(int xx): x(xx)+count; x+=10; virtual void show() const cout count _ x endl; protected: static int count; private: int x; ; class D: public B public: D(int xx, int yy): B(xx), y(yy)+count; y+=100; virtual void show() const cout count _ y endl; private: int y; ; int B: count=0; int main()
21、B *ptr=new D(10, 20); ptr- show(); delete ptr; return 0; 运行时的输出结果是 ( )。 ( A) 1120 ( B) 2120 ( C) l20 ( D) 220 26 有如下程序: #include iostream using namespace std; class Base public: virtual void functionl() cout 0; void function2()cout 1; ; class Derived: public Base public: void function1()cout 2; void
22、 function2()cout 3; ; int main() Base* p=new Derived(); p- ftmction1(); p- function2(); return 0; ; 运行时的输出结果是, ( )。 ( A) 01 ( B) 21 ( C) 03 ( D) 23 27 有如下程序: #include iostream using namespace std; class B public: virtual void f()cout “B“; void g()cout “B“; ) ; class D: public B public: void f()cout
23、“D“; void g()cout “D“; ; void h(B*p)p- f(); p- g(); int main() D obj; h(&obj); return 0; 运行这个程序的输出结果是 ( )。 ( A) DD ( B) BB ( C) BD ( D) DB 国家二级 C+机试(继承和派生)模拟试卷 3答案与解析 一、选择题 1 【正确答案】 B 【试题解析】 此题考查的是派生类中构造函数的定义。派生类的构造首先要调用基类的构造函数,对基类 成员初始化:然后对派生类中的新增成员初始化。格式为:派生类名 (构造函数形参表 )基类构造函数 (形参表 )。 【知识模块】 继承和派生
24、 2 【正确答案】 D 【试题解析】 此题考查的是类继承。派生类继承了基类的 (全部数据成员,私有成员 ),只是基类的私有成员在派生类中是隐藏的,只能在基类内部访问,故选项D错误。 【知识模块】 继承和派生 3 【正确答案】 A 【试题解析】 继承的方式包括三种:公有继承,保护继承和私有继承。如果不显示的给出继承方式,缺省的类继承方式是私有继承 private。 【知识模块】 继承和派生 4 【正确答案】 D 【试题解析】 基类中的私有成员在派生类中是隐蔽的,只能在基类内部访问。派生类中的成员不可以访问基类中的私有成员,只可以访问基类中的公有成员和保护成员。 【知识模块】 继承和派生 5 【正
25、确答案】 B 【试题解析】 类 Car不能派生自它本身。 【知识模块】 继承和派生 6 【正确答案】 D 【试题解析】 派生类对象对基类成员的访问权限: 对于公有继承,只有基类的公有成员可以被派生类对象访问,其他 (保护和私有 )成员不能被访问。 对于私有继承和保护继承,基类中所有成员都不能被派生类对象访问。派生类对基类成员的访问权限: 对于公有继承,基类中公有成员和保护成员可以访问,而基类中私有成员不能被访问。 对于私有继承和保护继承,也是基类中的公有成员和保护成员可以被派生类访问,而基类中的私有成员不能被访问。 【知识模块】 继承和派生 7 【正确答案】 B 【试题解析】 此题考查的是保护
26、继承。因为 Derived以 protected方式继承了Base类,所以父类 Base中的公有成员和保护成员均成了 Derived类的保护成员,而 Base类的私有成员 Derived类不可访问。所以,主函数中通过 Derived类的对象只能够。访问到 Derived类的公有成员。 【知识模块】 继承和派生 8 【正确答案】 C 【试题解析】 此题考查的是派生类对基类成员的访问。派生类对基类的各个成员的访问能力与继承方式无关,其成员不能访问基类中的私有成员,可以访问基类的公有成员和保护成员。 【知识模块】 继承和派生 9 【正确答案】 A 【试题解析】 在派生类对基类的三种继承形式中,都无法
27、对基类的私有成员访问A正确。在 B中,三种继承方式都能访问基类的保护成员,故 B不正确。 C选项的情况在 f()是基类私有成员情况下是对的,但是还有别的可能,并不一定正确。同样 D也不一定正确。 【知识模块】 继承和派生 10 【正确答案】 A 【试题解析】 基类 Parents的私有成员 privateData在派生类 ChildA和 ChildB中是不可以访问,所以选项 B、 D是错误,而派生类 ChildB私有继承基类Parents,所以基类 Parents的公有成员 publicData在派生类 ChildB中变为私有成员,只能在派 生类 ChildB内部访问,因而选项 C是错误的。派
28、生类 ChildA公有继承基类 Parents,所以基类 Parents的公有成员 publicData在派生类 ChildA中可以访问。 【知识模块】 继承和派生 11 【正确答案】 C 【试题解析】 在 C+中派生类从基类保护继承时,基类的公有成员在派生类中改变为保护成员,基类的保护成员在派生类中仍为保护成员。所以对于本题来说,YY类保护继承自类 XX,那么类 XX中的公有成员 x3和保护成员 x2在派生类中都成为保护成员,再加上类 YY。中的保护成员 y2,因 此在派生类 YY中保护成员的个数为 3。 【知识模块】 继承和派生 12 【正确答案】 B 【试题解析】 派生类不论是采用那种继
29、承方式继承基类,它的成员函数只能访问基类的公有成员和保护成员。 【知识模块】 继承和派生 13 【正确答案】 D 【试题解析】 由于类 YY公开继承自类 XX,所以执行表达式c gctV()+c getX()的值等于 3+3+4=10。 【知识模块】 继承和派生 14 【正确答案】 B 【试题解析】 此题考查的是派生类对象的构造与析构。建立派生 类对象时,构造函数的执行顺序如下:执行基类的构造函数,一调用顺序按照各个基类被定义时声明的顺序 (自左向右 )-执行成员对象的构造函数;调用顺序按照各个成员对象在类中声明的顺序 -执行派生类的构造函数。所以本题在建立派生类 B的对象obj是会先调用基类
30、 A的构造函数,然后调用自身的构造函数。注意: B类中定义的成员 p是 A类的指针而不是一个对象,故在调用自身构造函数前不需要构造。而在 B类构造函数中使用 new操作符动态地构造了一个 A类的对象,所以整个构造结果是输出: ABA。 派生类对象的析构与构造严格相反,即先 析构自身,然后析构自身所包含的成员对象,最后调用基类的析构函数。故本题中当 main()函数返回时,析构 B类的对象 obj:首先调用 B(),接着再调用 A()因为在 B()函数中释放了动态创建的A类对象,故整个析构所输出的结果是 B A A。所以这个程序输出结果为ABA B A A。 【知识模块】 继承和派生 15 【正
31、确答案】 D 【试题解析】 此题考查的是派生类的构造函数和析构函数。在撤销派生类对象时,析构函数的执行过程和构造函数严格相反,即:对派生类新增普通成员进行清理;调用成员对象析构 函数,调用基类析构函数对基类进行清理。 【知识模块】 继承和派生 16 【正确答案】 C 【试题解析】 此题考查的是派生类的构造与析构。建立派生类的对象时,构造函数的执行顺序如下:执行基类的构造函数,调用顺序按照各个基类被继承时声明的顺序 (自左向右 )-执行成员对象的构造函数,调用顺序按照各个成员对象在类中声明的顺序 -执行自身的构造函数。此题中,执行语句 Derived d1(3)首先调用基类的构造函数,输出 0;
32、接着调用自身的构造函数输出 3。执行语句 Derived d2(5, 7)时,会调用基 类的 Base(n)函数输出 7;然后执行继承类中的 Derived(int m, int n)的 y(m)输出 5。 【知识模块】 继承和派生 17 【正确答案】 A 【试题解析】 在主函数中创建类 Derived对象 obj12(2, 3)时,因为类 Derived是从基类 Base派生而来,所以首先调用基类的构造函数,输出 2,再调用派生类构造函数,输出 3。当主函数运算结果时,首先调用派生类的析构函数,输出 3,再调用基类的析构函数输出 2。所以输出结果为 2332。 【知识模块】 继承和派生 18
33、 【正 确答案】 D 【试题解析】 程序在创建派生类对象 d时,分别调用基类 Base1和 Base1的构造函数。 【知识模块】 继承和派生 19 【正确答案】 C 【试题解析】 派生类 Derived的对象 d调用其成员函数 fun(),要输出结果为BD,所以在其成员函数 fun()中要调用基类 Base的成员函数 fun( )。 【知识模块】 继承和派生 20 【正确答案】 D 【试题解析】 此题考查的是虚函数的概念。 C+语言的多态性有两种:函数重载和虚函数。虚函数只有在运行时才能被 确定,称为运行时多态。编译时的多态是通过函数重载和模板实现的。 【知识模块】 继承和派生 21 【正确答
34、案】 C 【试题解析】 此题考查的是虚函数的概念。此题中, func1是虚函数, func2是一般成员函数,而且在派生类与基类中都存在两个这样的函数。在主函数中,语句 A*p=new B;定义了一个基类的指针 p,并让它指向一个派生类对象。所以通过该指针调用 func1时,运行的是派生类的版本,而通过该指针调用 func2运行的是基类的版本。所以程序运行的最后输出是: B1A2。 【知识模块】 继 承和派生 22 【正确答案】 B 【试题解析】 此题考查的是虚函数与多态性。在成员函数的声明前面加上 virual关键字,即可把函数声明为虚函数:在 C+中,一个基类指针可以用于指向它的派生类对象,
35、而且通过这样的指针调用虚函数时,被调用的是该指针实际所指向的对象类的那个重定义版本。本题中,从基类的定义可以看出: output()函数是普通成员函数,而 Print()函数是虚函数。所以,通过 ptr指针调用的 output()是基类中的 output(),而通过它调用的 Print()则是派生类中的 Print( )。 【知识模块】 继承和派生 23 【正确答案】 C 【试题解析】 此题考查派生类与虚函数的考查。由主函数 main入手,其中分别定义了类 GA和 GB的对象 a和 b。首先,执行参数 a的 show函数调用,其中的输出语句为调用 GA类中的 f()虚函数,返回 1。同理 di
36、splay(a)函数输出 1。show(b)函数中调用的为 GA中的 f()函数, display(b)调用 GA中 f()函数,返回 1,display(b)调用 GB中的 f()函数返回 2。所以最后输出为 1112。 【知识模块】 继承和派生 24 【正确答案】 D 【试题解析】 在派生类 classB中对基类中的虚拟成员函数 virtualvoidf()和实函数void g()进行了重新定义,在主函数中通过语句 show(b);调用派生类中的虚函数virtual void f()cout 3; 输出 3,调用基类的实函数 void g()eout 2; 输出2。所以选项 D为正确答案。
37、 【知识模块】 继承和派生 25 【正确答案】 B 【试题解析】 在主函数中定义了一个基类 B的指针变量 ptr,并调用类 D的构造函数创建了类 D的实例对象,因为变量 count是全局变量所以在调用基类 B的构造函数给其值加 1,在调用 D的构造函数时给其值加 1,因而输出其值等于 2,在类 D的构造函数中给成员变量 y的值加 100,所以其等于 120并输出。 【知识模块】 继承和派生 26 【正确答案】 B 【试题解析】 函数 function1()在基类 Base中定义为虚成员函数,而在派生类Dervied中重新进行了定义,输出字符 2,函数 function2()在基类 Base中定义虚成员函数,在主函数中使用指向基类的指针变量 p访问 function2()时,输出 1。 【知识模块】 继承和派生 27 【正确答案】 D 【试题解析】 在基类 B中定义虚函数 f()和成员函数 g(),而在派生类 D中定义了函数 f()和同名函数 g( )。而函数 h中的形参为指向基类的指针变量 p,所以在主函数中执行 h(& obj)时,会调用派生类的函数 f(),输出 D,再调用基类的函数g(),输出 B。 【知识模块】 继承和派生
copyright@ 2008-2019 麦多课文库(www.mydoc123.com)网站版权所有
备案/许可证编号:苏ICP备17064731号-1