C++继承与派生类习题Word文档下载推荐.docx
《C++继承与派生类习题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《C++继承与派生类习题Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
虚基类的构造函数,派生类中子对象类的构造函数,
派生类自己的构造函数。
例题5:
C++类体系中,能被派生类继承的是(
)。
A.构造函数
B.虚函数
C.析构函数
D.友元函数
B
C++类体系中,构造函数、析构函数和友元函数是不能被派生类继承的.
例题6:
设有基类定义:
classCbase
{
private:
inta;
protected:
intb;
public:
intc;
};
派生类采用何种继承方式可以使成员变量b成为自己的私有成员(
)
A.
私有继承
B.保护继承
C.
公有继承
D.私有、保护、公有均可
A
私有继承时,基类的protected成员在派生类中作为private成员。
例题7:
C++将类继承分为
(1)
和
(2)
两种。
(1)单继承 (2)多继承
派生类可以只从一个基类中派生,也可以从多个基类中派生。
从一个基类中派生的继承方式称为单继承。
从多个基类中派生的继承方式称为多继承。
例题8:
派生类可以定义其_______________中不具备的数据和操作。
基类
派生类是从基类派生的,派生类包含了它所有基类的除构造函数、析构函数之外的所有成员,同时还拥有它自己的新成员。
例题9:
派生类构造函数的初始化列表中包含____________________________。
初始化基类数据成员、新增内嵌对象数据及新增一般成员数据所需要的全部参数。
例题10:
在继承机制下,当对象消亡时,编译系统先执行
(1)
的析构函数,然后才执行
(2)
的析构函数,最后执行
(3)
的析构函数。
(1)派生类
(2)派生类中子对象类 (3)基类
派生类的析构函数的执行次序与构造函数正好相反,先调用派生类的析构函数,再调用派生类中子对象类的析构函数,最后调用基类的析构函数。
例题11:
设有以下类的定义:
classA
classB:
protectedA
classC:
privateB
int
A1;
intb1;
intc1;
intA2;
intb2;
intc2;
intA3;
intb3;
intc3;
请按访问权限写出派生类C中具有的成员。
私有成员:
保护成员:
公有成员:
。
(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<
iostream.h>
classPoint
intx,y;
Point(inta=0,intb=0){x=a;
y=b;
}
voidmove(intxoffset,intyoffset){x+=xoffset;
y+=yoffset;
intgetx(){returnx;
intgety(){returny;
classRectangle:
protectedPoint
intlength,width;
Rectangle(intx,inty,intl,intw):
Point(x,y)
length=l;
width=w;
intgetlength(){returnlength;
intgetwidth(){returnwidth;
voidmain()
{Rectangler(0,0,8,4);
r.move(23,56);
cout<
<
r.getx()<
"
"
r.gety()<
r.getlength()<
r.getwidth()<
endl;
保护继承方式使基类的public成员在派生类中的访问属性变为protected,所以派生类Rectangle的对象r不能直接访问基类的成员函数move()、getx()和gety()。
其改正方法有两种:
1)将Rectangle的继承方式改为公有继承public;
2)在Rectangle类中重定义move(),getx()和gety()函数,覆盖基类的同名函数。
voidRectangle:
:
move(intxoffset,intyoffset){Point:
move(xoffset,yoffset);
getx(){returnPoint:
getx();
gety(){returnPoint:
gety();
例题13:
classA
{public:
intx;
A(inta=0){x=a;
voiddisplay(){cout<
A.x="
x<
}
classB
B(inta=0){x=a;
voiddisplay(){cout<
B.x="
publicA,publicB
inty;
C(inta,intb,intc):
A(a),B(b)
y=c;
intgety(){returny;
{Cmyc(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:
myc.B:
display();
例题14:
看程序写结果
#include<
classBase
inti;
Base(intn){cout<
Constuctingbaseclass"
<
endl;
i=n;
~Base(){cout<
Destructingbaseclass"
voidshowi(){cout<
i<
"
;
intGeti(){returni;
classDerived:
publicBase
intj;
Baseaa;
Derived(intn,intm,intp):
Base(m),aa(p){
cout<
Constructingderivedclass"
j=n;
~Derived(){cout<
Destructingderivedclass"
voidshow(){Base:
showi();
j<
aa.Geti()<
{Derivedobj(8,13,24);
obj.show();
说明:
派生类的构造函数的执行次序,先调用基类的构造函数,再调用派生类中子对象类的构造函数,最后调用派生类的构造函数。
析构函数的执行次序与构造函数正好相反,先调用派生类的析构函数,再调用派生类中子对象类的析构函数,最后调用基类的析构函数。
运行结果:
Constuctingbaseclass
Constructingderivedclass
13,8,24
Destructingderivedclass
Destructingbaseclass
9.3教材习题分析与解答
1.选择题
(1)C++中的类有两种用法:
一种是类的实例化,即生成类对象,并参与系统的运行;
另一种是通过()派生了新的类。
A.复用
B.继承
C.封装
D.引用
B
(2)继承具有(
),即当基类本身也是某一个类派生类时,底层的派生类也会自动继承间接基类的成员。
A)规律性
B.传递性
C.重复性
D.多样性
(3)下列对基类和派生类关系的描述中,错误的是(
A.派生类是基类的具体化
B.派生类是基类的子集
C.派生类是基类