C++给学生习题第8章练习题 下载本文

内容发布更新时间 : 2024/5/7 9:35:46星期一 下面是文章的全部内容请认真阅读。

第8章练习题

同步练习8.1

1.一个大的应用程序,通常由多个类构成,类与类之间互相协同工作, 它们之间有三种主要关系。下列不属于类之间关系的是()。

(A)gets-a (A)自反性

(B)has-a (B)对称性

(C)uses-a (C)传递性

(D)is-a (D)反对称性

2.在C++中,类之间的继承关系具有()。 3.下列关于类之间关系的描述,正确的是()。

(A)has-a表示一个类部分地使用另一个类 (B)uses-a表示类的包含关系 (C)is-a关系具有对称性。 (A)父类具有子类的特征 (C)is-a关系具有传递性

(D)is-a机制称为“继承” (B)一个类只能从一个类继承 (D)uses-a表示类的继承机制

4.下列关于类的描述,正确的是()。

5.下列关于类的继承描述中,正确的是()。

(A)派生类公有继承基类时,可以访问基类的所有数据成员,调用所有成员函数。 (B)派生类也是基类,所以它们是等价的。

(C)派生类对象不会建立基类的私有数据成员,所以不能访问基类的私有数据成员。 (D)一个基类可以有多个派生类,一个派生类可以有多个基类。 【解答】

A

C

D

C

D

同步练习8.2

一、选择题

1.当一个派生类公有继承一个基类时,基类中的所有公有成员成为派生类的()。 (A)public成员 (A)public成员 (A)public成员 (A)public成员 (A)public (A)私有成员

7.下列关于类层次中重名成员的描述,错误的是()。 (A)C++允许派生类的成员与基类成员重名

(B)在派生类中访问重名成员时,屏蔽基类的同名成员 (C)在派生类中不能访问基类的同名成员

(D)如果要在派生类中访问基类的同名成员,可以显式地使用作用域符指定 8.下列关于类层次中静态成员的描述,正确的是()。 (A)在基类中定义的静态成员,只能由基类的对象访问

(B)private成员 (B)private成员 (B)private成员 (B)private成员 (B)private

(C)protected成员 (C)protected成员 (C)protected成员 (C)protected成员 (C)protected (C)保护成员

(D)友元 (D)友元 (D)友元 (D)所有成员 (D)public或protected (D)保护成员或私有成

2.当一个派生类私有继承一个基类时,基类中的所有公有成员和保护成员成为派生类的()。 3.当一个派生类保护继承一个基类时,基类中的所有公有成员和保护成员成为派生类的()。 4.不论派生类以何种方式继承基类,都不能直接使用基类的()。 5.在C++中,不加说明,则默认的继承方式是()。

6.某公有派生类的成员函数不能直接访问基类中继承来的某个成员,则该成员一定是基类中的()。

(B)公有成员

(B)在基类中定义的静态成员,在整个类体系中共享

(C)在基类中定义的静态成员,不管派生类以何种方式继承,在类层次中具有相同的访问性质 (D)一旦在基类中定义了静态成员,就不能在派生类中再定义

【解答】 A

B C B B A C B

同步练习8.3

一、选择题

1.在C++中,可以被派生类继承的函数是()。 (A)成员函数

(B)构造函数

(C)析构函数

(D)友元函数

2.下列关于派生类对象的初始化,叙述正确的是()。 (A)是由派生类的构造函数实现的 (B)是由基类的构造函数实现的 (C)是由基类和派生类的构造函数实现的 (D)是系统自动完成的,不需要程序设计者干预 3.在创建派生类对象时,构造函数的执行顺序是()。

(A)对象成员构造函数—基类构造函数—派生类本身的构造函数 (B)派生类本身的构造函数—基类构造函数—对象成员构造函数 (C)基类构造函数—派生类本身的构造函数—对象成员构造函数 (D)基类构造函数—对象成员构造函数—派生类本身的构造函数 4.在具有继承关系的类层次体系中,析构函数执行的顺序是()。 (A)对象成员析构函数—基类析构函数—派生类本身的析构函数 (B)派生类本身的析构函数—对象成员析构函数—基类析构函数 (C)基类析构函数—派生类本身的析构函数—对象成员析构函数 (D)基类析构函数—对象成员析构函数—派生类本身的析构函数 5.在创建派生类对象时,类层次中构造函数的执行顺序是由()。 (A)派生类的参数初始式列表的顺序决定的 (C)是由类的书写顺序决定的

(B)系统规定的 (D)是任意的

【解答】 A

C

D B B

同步练习8.5

一、选择题

1.当不同的类具有相同的间接基类时,()。

(A)各派生类无法按继承路线产生自己的基类版本

(B)为了建立唯一的间接基类版本,应该声明间接基类为虚基类 (C)为了建立唯一的间接基类版本,应该声明派生类虚继承基类 (D)一旦声明虚继承,基类的性质就改变了,不能再定义新的派生类 2.下列关于多继承的描述,错误的是()。

(A)一个派生类对象可以拥有多个直接或间接基类的成员 (B)在多继承时不同的基类可以有同名成员

(C)对于不同基类的同名成员,派生类对象访问它们时不会出现二义性 (D)对于不同基类的不同名成员,派生类对象访问它们时不会出现二义性 3.下面关于基类和派生类的描述,正确的是()。

(A)一个类可以被多次说明为一个派生类的直接基类,可以不止一次地成为间接基类

(B)一个类不能被多次说明为一个派生类的直接基类,可以不止一次地成为间接基类 (C)一个类不能被多次说明为一个派生类的直接基类,且只能成为一次间接基类 (D)一个类可以被多次说明为一个派生类的直接基类,但只能成为一次间接基类 4.下列关于虚继承的说明形式的描述,正确的是()。 (A)在派生类类名前添加关键字virtual (C)在基类类名后添加关键字virtual 5.设置虚基类的目的是()。 (A)简化程序 【解答】 C

二、程序练习

1.阅读程序,写出运行结果。

#include using namespace std; class A { public :

A(const char *s) { cout << s << endl; } ~A() {} };

class B : virtual public A { public :

B(const char *s1, const char *s2) : A( s1 ) { cout << s2 << endl; } };

class C : virtual public A { public :

C(const char *s1, const char *s2):A(s1) { cout << s2 << endl; } };

class D : public B, public C { public :

D( const char *s1,const char *s2,const char *s3,const char *s4 ): B( s1, s2 ), C( s1, s3 ), A( s1 ) { cout << s4 << endl; } }; int main()

{ D *ptr = new D( \ delete ptr; } 【解答】

C

B

(B)消除二义性 D

B

(C)提高运行效率 (D)减少目标代码

(B)在基类类名前添加关键字virtual

(D)在派生类类名后,类继承的关键字之前添加关键字virtual