C++给学生习题第8章练习题

更新时间:2023-12-01 04:13:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

第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

综合练习

一、思考题

1.函数和类这两种程序模块都可以实现软件重用,它们之间有什么区别? 【解答】

函数是基于参数集的功能抽象模块,以调用方式实现软件重用,函数之间没有逻辑关系。 类是数据属性与操作的封装,以继承方式实现软件重用,类之间构成有向无回图的类格。

2.按照类成员的访问特性、类层次的继承特点,制作一张表格,总结各种类成员在基类、派生类中的可见性和作用域。 【解答】 基类成员 派生类继承 public 在派生类中访问特性不变。派生类和类外均可见,有作用域。 protected private 在派生类中访问特性不变。类体系中可见。 基类私有成员,仅在基类中可见。 public protected private 成为派生类保护段成员。在整个类体系中可见。 成为派生类私有成员。仅在派生类和基类中可见。 派生类不论以何种方式继承基类,基类所有成员在整个类体系有作用域。

3.若有以下说明语句:

class A

{ private : int a1;

public : int a2; double x; /*…*/ };

class B : private A { private : int b1; public : int b2; double x; /*…*/ }; B b;

对象b将会生成什么数据成员?与继承关系、访问特性、名字有关吗? 【解答】

对象b生成的数据成员有a1 a2 A::x b1 b2 B::x,共六个数据成员。数据成员的建立和继承关系、访问特性、名字无关。

7.“虚基类”是通过什么方式定义的?如果类A有派生类B、C,类A是类B虚基类,那么它也一定是类C的虚基类吗?为什么? 【解答】

虚基类是在声明派生类时,指定继承方式时声明的,声明虚基类的一般形式为:

class 派生类名: virtual 继承方式基类名

若类A是类B和类C的虚基类,但不一定是类C的虚基类,原因在于“虚基类”中的“虚”不是基类本身的性质。而是派生类在继承过程中的特性。关键字virtual只是说明该派生类把基类当作虚基类继承,不能说明基类其他派生类继承基类的方式

8.在具有虚继承的类体系中,建立派生类对象时,以什么顺序调用构造函数?请用简单程序验证你的分析。

【解答】

在具有虚继承的类体系中,建立派生类对象时先调用间接基类构造函数,再按照派生类定义时各个直接基类继承的顺序调用直接基类的构造函数,最后再对派生类对象自身构造函数。

另外,C++为了保证虚基类构造函数只被建立对象的类执行一次,规定在创建对象的派生类构造函数中只调用虚基类的构造函数和进行(执行)自身的初始化。参数表中的其他调用被忽略,即直接基类的构造函数只调用系统自带的版本,或调用自定义版本但不对虚基类数据成员初始化。

程序略。

本文来源:https://www.bwwdw.com/article/k1ft.html

Top