C++继承与派生类习题
更新时间:2023-09-27 21:29:01 阅读量: 综合文库 文档下载
第九章继承与派生类
9.2 典型例题分析与解答
例题1:下列对派生类的描述中,( )是错误的。 A. 一个派生类可以作为另一个派生类的基类 B. 派生类至少有一个基类
C. 派生类的成员除了它自己的成员外,还包含了它的基类成员 D. 派生类中继承的基类成员的访问权限到派生类保持不变 答案:D
分析:一个派生类可以作为另一个派生类的基类。无论是单继承还是多继承,派生类至少有一个基类。派生类的成员除了它自己的成员外,还包含了它的基类成员。派生类中继承的基类成员的访问权限到派生类受继承方式影响的,对于私有继承,基类的public,protected成员在派生类中作为private成员;对于公有继承,基类的public,protected成员在派生类中访问属性不变;对于保护继承,基类的public、protected成员在派生类中作为protected成员。 例题2:派生类的对象对它的哪一类基类成员是可以访问的?( )
A.公有继承的基类的公有成员 B. 公有继承的基类的保护成员 C. 公有继承的基类的私有成员 D. 保护继承的基类的公有成员 答案:A 分析:公有继承的基类的公有成员在派生类中保持公有访问权限,所以派生类对象可以访问它;公有继承的基类的保护成员在派生类中保持保护访问权限,所以派生类对象不可以访问它;基类的私有成员不能被派生到派生类中,所以派生类对象不可以访问它;保护继承的基类的公有成员在派生类中变成保护的访问权限,所以派生类对象不可以访问它。
例题3:关于多继承二义性的描述,( )是错误的。
A. 派生类的多个基类中存在同名成员时,派生类对这个成员访问可能出现二义性 B. 一个派生类是从具有共同的间接基类的两个基类派生来的,派生类对该公共基类的
访问可能出现二义性
C. 解决二义性最常用的方法是作用域运算符对成员进行限定 D. 派生类和它的基类中出现同名函数时,将可能出现二义性 答案:D
分析:出现二义性有两种情况:调用不同基类的相同成员时可能出现二义性;访问共同基类的成员时可能出现二义性。消除二义性的方法是采用作用域运算符。派生类和它的基类中出现同名函数时,不可能出现二义性。
例题4:多继承派生类构造函数构造对象时,( )被最先调用。
A.派生类自己的构造函数 B.虚基类的构造函数
C.非虚基类的构造函数 D.派生类中子对象类的构造函数 答案:B
分析:多继承派生类构造函数构造对象时,构造函数的调顺序是:虚基类的构造函数,派生类中子对象类的构造函数, 派生类自己的构造函数。
例题5: C++类体系中,能被派生类继承的是( )。
A.构造函数 B.虚函数 C.析构函数 D.友元函数
答案:B
分析:C++类体系中,构造函数、析构函数和友元函数是不能被派生类继承的.
例题6:设有基类定义:
class Cbase { private: int a; protected: int b; public: int c; };
派生类采用何种继承方式可以使成员变量b成为自己的私有成员( )
A. 私有继承 B.保护继承
C. 公有继承 D.私有、保护、公有均可 答案:A
分析:私有继承时,基类的protected成员在派生类中作为private成员。
例题7:C++将类继承分为 (1) 和 (2) 两种。 答案:(1)单继承 (2)多继承
分析:派生类可以只从一个基类中派生,也可以从多个基类中派生。从一个基类中派生的继承方式称为单继承。从多个基类中派生的继承方式称为多继承。 例题8:派生类可以定义其_______________中不具备的数据和操作。 答案:基类
分析:派生类是从基类派生的,派生类包含了它所有基类的除构造函数、析构函数之外的所有成员,同时还拥有它自己的新成员。
例题9:派生类构造函数的初始化列表中包含____________________________。
答案:初始化基类数据成员、新增内嵌对象数据及新增一般成员数据所需要的全部参数。
例题10:在继承机制下,当对象消亡时,编译系统先执行 (1) 的析构函数,然后才执行 (2) 的析构函数,最后执行 (3) 的析构函数。
答案:(1)派生类 (2)派生类中子对象类 (3)基类
分析:派生类的析构函数的执行次序与构造函数正好相反,先调用派生类的析构函数,再调用派生类中子对象类的析构函数,最后调用基类的析构函数。
例题11:设有以下类的定义:
class A class B: protected A class C: private B { int A1; { int b1; { int c1;
protected: int A2; protected: int b2; protected: int c2; public: int A3; public: int b3; public: int c3; }; }; };
请按访问权限写出派生类C中具有的成员。 私有成员: (1) 保护成员: (2) 公有成员: (3) 。
答案:(1)c1、b2、b3、A2、A3 (2)c2 (3)c3
分析:B类有它自己的私有成员b1、保护成员b2和公有成员有b3,另外B类是以保护方式从A类中派生出来的,所以A类保护成员A2和公有成员A3在B类中都变成保护类型的;C类有自己的私有成员c1、保护成员c2和公有成员有c3,C类是以私有方式从B类中派生出来的,所以B类中的b2、b3、A2和A3在C类中都变成私有的访问方式。
例题12:指出并改正下面程序中的错误。
#include
Point(int a=0,int b=0) {x=a; y=b;}
void move(int xoffset,int yoffset) {x+=xoffset; y+=yoffset;} int getx() {return x;} int gety() {return y;} };
class Rectangle:protected Point { int length,width; public:
Rectangle(int x,int y,int l,int w):Point(x,y) { length=l;width=w;}
int getlength(){return length;} int getwidth(){return width;} };
void main()
{ Rectangle r(0,0,8,4); r.move(23,56);
cout< < } 分析:保护继承方式使基类的public成员在派生类中的访问属性变为protected,所以派生类Rectangle的对象r不能直接访问基类的成员函数move()、getx()和gety()。其改正方法有两种:1)将Rectangle的继承方式改为公有继承public;2)在Rectangle类中重定义move(),getx()和gety()函数,覆盖基类的同名函数。 void Rectangle::move(int xoffset,int yoffset){Point::move(xoffset,yoffset);} void Rectangle::getx(){return Point::getx();} void Rectangle::gety(){return Point::gety();} 例题13:指出并改正下面程序中的错误。 #include A(int a=0) {x=a;} void display() { cout<<\ }; class B { public: int x; B(int a=0) {x=a;} void display() {cout<<\ }; class C:public A,public B { int y; public: C(int a,int b,int c) :A(a),B(b) { y=c; } int gety() { return y; } }; void main() { C myc(1,2,3); myc.x=10; myc.display(); } 分析:类A、B中有同名公有数据成员x和同名成员函数display(),在主函数中访问对象myc的数据成员x是无法确定是访问从A中继承的还是从B中继承的x;调用成员函数也是如此,无法确认是调用类A中的还是类B中的,产生二义性。改正方法,可以用作用域区分符加以限定,如改成myc.A::x=10; myc.A::display();或myc.B::x=10; myc.B::display(); 例题14:看程序写结果 #include Base(int n){cout <<\ ~Base(){cout <<\ void showi(){cout << i<< \ int Geti(){return i;} }; class Derived:public Base { int j; Base aa; public: Derived(int n,int m,int p):Base(m),aa(p){ cout << \ j=n; } ~Derived(){cout <<\ void show(){Base::showi(); cout << j<<\ }; void main() { Derived obj(8,13,24); obj.show(); } 说明:派生类的构造函数的执行次序,先调用基类的构造函数,再调用派生类中子对象类的构造函数,最后调用派生类的构造函数。析构函数的执行次序与构造函数正好相反,先调用派生类的析构函数,再调用派生类中子对象类的析构函数,最后调用基类的析构函数。 运行结果: Constucting base class Constucting base class Constructing derived class 13,8,24 Destructing derived class Destructing base class Destructing base class 9.3 教材习题分析与解答 1.选择题 (1)C++中的类有两种用法:一种是类的实例化,即生成类对象,并参与系统的运行;另一种是通过()派生了新的类。 A.复用 B.继承 C.封装 D.引用 答案:B (2)继承具有( ),即当基类本身也是某一个类派生类时,底层的派生类也会自动继承间接基类的成员。 A)规律性 B.传递性 C.重复性 D.多样性 答案:B (3)下列对基类和派生类关系的描述中,错误的是( )。 A.派生类是基类的具体化 B.派生类是基类的子集 C.派生类是基类定义的延续 D.派生类是基类的组合 答案:B (4)下列对派生类的描述中,错误的是( )。 A. 一个派生类可以作为另一个派生类的基类 B. 派生类至少有一个基类 C. 派生类的缺省继承方式是private D. 派生类只含有基类的公有成员和保护成员 答案:D
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- C++
- 派生
- 习题
- 继承
- 深基坑安全专项施工案(审,改)
- 药事法规论文2
- 操作系统复习题(整理)
- 多梦的季节的教学设计
- 110kV-1000kV变电(换流)站土建工程施工质量验收及评定规程(QGDW 183—2008)
- 软启动柜规格书 2
- 浅谈《红楼梦》人物对话的言外之意
- 实验五 TCP协议分析
- 2012年建省幼儿园教师招考综合和专业考试大纲文档
- 2014珠海远程教育招生入学考试英语(一)复习题
- 小学四年级下册心理健康教案(叶一舵)
- 2018-2024年硼酸锌市场评估分析及发展前景调研战略研究报告(目录)
- 遗传学复习题整理
- 2015年机电运输安全质量标准化达标工作实施方案
- 纳税基础与实务作业3
- 15-16下每周少先队活动课主题(第一次)
- ECS调试手册 - 实时库创建与通讯配置的设置V1.01
- 北交大交通规划原理作业
- 地球科学概论试题集与知识点
- 人教版最新高考数学专题复习测试题 - 三角函数(文科)Word版