实验五类的继承与派生Word文件下载.docx
《实验五类的继承与派生Word文件下载.docx》由会员分享,可在线阅读,更多相关《实验五类的继承与派生Word文件下载.docx(19页珍藏版)》请在冰点文库上搜索。
classsweetpeach:
publicpeach//单继承
datatypecolor,shape,taste;
sweetpeach类只是继承自peach类,即sweetpeach类只有一个基类,这就是单继承。
2.多继承派生类的定义格式
:
<
继承方式1>
,<
继承方式2>
…….
派生类成员的定义;
多继承与单继承在定义格式的区别仅在于它们的基类个数不同,单继承的基类只有一个,而多继承的基类有多个,相邻两个基类之间用逗号间隔,每个基类名前都应有一个该基类的继承方式的说明符。
classpeach//定义基类:
peach
datatypecolor,shape;
classapple//定义基类:
datatypecolor,shape,weight;
classsweetpeach:
publicpeach,publicapple//多继承
datatypecolor,shape,taste;
类sweetpeach同时继承自类peach和类apple,这就是多继承。
3.继承的作用
有的读者可能会问为什么要有继承,继承有什么好处,继承的作用是什么?
为了解决这些疑问,我们一起来分析以下例子,从中领悟继承的奥妙。
【例10-1-1】分析以下代码。
声明一个person类,它包含的成员有name(姓名)、age(年龄)、gender(性别),和output函数,具体定义如下:
classperson
public:
charname[8];
intage;
chargender;
voidoutput(){}
};
现在要声明一个student类,它包含的成员有name(姓名),age(年龄),gender(性别),department(系),stuno(学号),address(住址),和output函数,具体定义如下:
classstudent
intage;
chargender;
chardepartment[20];
intstuno;
intaddress;
从这两个类的声明中可以看出,它们中有些成员数据和成员函数是相同的。
这样就存在代码的重复,为了提高代码的可重用性,就引入了继承。
即,如果student类以共有继承的方式继承person类,那么student类就可以直接使用person类中的共有成员如name,gander,age和output()函数,这样在student类中就不需要再定义与person类中相同的变量了,只定义person类中没有的在student类中需要的变量。
具体实现如下:
classstudent:
publicperson//student共有继承person类
intstuno;
intaddress;
提示
Ø
student类称为派生类,person类成为基类;
关键字public的作用是说明派生类公有继承了基类中的所有成员,即派生类可以直接访问基类的成员;
继承可以使代码得以重用,提高工作效率。
三、派生类访问基类成员
通过前面的学习大家都知道基类的成员有public(公有)、protected(保护)、private(私有)3种访问属性,基类的自身成员可以对基类中任何一个其他成员进行访问,但是通过基类的对象就只能访问该类的公有成员。
派生类可以继承基类中除了构造函数和析构函数之外的全部成员,但是这些成员的访问属性在派生过程中是可以调整的。
从基类继承来的成员在派生类中的访问属性是由继承方式控制的。
不同的继承方式导致原来具有不同的访问属性的基类成员在派生类的访问属性也有所不同。
在派生类中,从基类继承来的成员可以访问属性有4种:
不可直接访问的成员、public(公有成员)、protected(保护成员)、private(私有成员)。
1.三种继承方式的声明
public公有继承
公有继承:
在定义一个派生类时将基类的继承方式指定为public的继承方式。
classstudent:
publicperson{}
private私有继承
私有继承:
在定义一个派生类时将基类的继承方式指定为private的继承方式。
privateperson{}
protected保护继承
保护继承:
在定义一个派生类时将基类的继承方式指定为protected的继承方式。
protectedperson{}
2.三种继承方式的区别
如表1指明了三种继承方式的区别,即派生类对基类成员的访问能力。
表1三种继承方式的区别
在基类中的访问属性
继承方式
在派生类中的访问属性
private
public
不可直接访问
protected
在任何继承方式中基类中的私有成员都不允许派生类继承,即在派生类中是不可直接访问基类中的私有成员。
当类的继承方式为公有继承时:
基类中的所有公有成员在派生类中仍为公有成员;
基类中的所有保护成员在派生类中仍为保护成员。
当类的继承方式为私有继承时:
基类中的所有公有成员在派生类中都为私有成员;
基类中的所有保护成员在派生类中都为私有成员。
当类的继承方式为保护继承时:
基类中的所有公有成员在派生类中都为保护成员;
派生类对基类成员的访问形式主要有以下两种:
(1)内部访问:
由派生类中的新增成员对从基类继承来的成员的访问。
(2)对象访问:
在派生类外部,通过派生类的对象对从基类继承的成员的访问。
现在分别讨论在公有继承、私有继承、保护继承这3种继承方式下,派生类对基类成员的访问规则。
一、公有继承
【例1】分析以下程序。
源代码:
#include<
iostream.h>
stdlib.h>
classBase
private:
intpvx;
//pvx为基类私有变量
protected:
intpty;
//pty为基类保护变量
floatpuf;
//puf为基类公有变量
voidSetxy(intq,intu,floatw)//Setxy()为基类公有函数
{
pvx=q;
pty=u;
puf=w;
}
voidOutput()//Output()为基类公有函数
cout<
"
classBaseoutput"
endl;
pvx="
pvx<
pty="
pty<
puf="
puf<
}
classDerive:
publicBase//公有单继承
private:
floatpvz;
voidSetvalue(intx,inty,floatf,floatz)
Setxy(x,y,f);
pvx=x;
//非法访问,基类中的pvx为private属性,不能被继承
pty=y;
//合法访问
puf=f;
pvz=z;
voidPrint()
cout<
//非法访问,在基类中pvx为私有成员
classDeriveoutput"
pty<
//合法访问,在基类中pvy为保护成员
puf<
//合法访问,在基类中puf为公有成员
pvz="
pvz<
//合法访问,pvz为派生类自己的成员
};
voidmain()
Deriveobj;
obj.Setvalue(3,5,8.9,12.6);
obj.Output();
obj.Print();
obj.puf<
//合法访问,puf为基类公有成员
cout<
obj.pty<
endl;
//非法访问,类的外部不能访问为基类保护成员pty
system("
pause"
);
运行输出:
classBaseoutput
pvx=3
pty=5
puf=8.9
classDeriveoutput
pvz=12.6
【简要分析】
①“classDerive:
publicBase{}”表明这是一个公有继承的例子,基类Base中有3个变量和两个函数:
私有变量pvx、保护变量pty、公有变量puf和公有函数Setxy()、Output()。
其中:
被Derive派生类继承后,pvx在派生类中不能直接访问,只能通过Base中具有public属性的函数对其间接访问;
pty被Derive派生类继承之后仍为protected属性,派生类成员可以直接访问;
puf、Setxy()、Output()这3个具有public属性成员被Derive派生类继承后,仍为public属性,派生类成员可以对其直接访问。
②输出的前4行:
调用“obj.Output();
”的输出结果。
输出的后4行:
调用“obj.Print();
最后1行:
调用“cout<
结论:
在公有继承中,无论是派生类中的成员还是派生类对象都不能直接访问基类中的private成员;
派生类的成员可以访问继承来的protected成员和public成员;
但是,类的外部使用者只能通过派生类的对象访问继承来的public成员,不能访问继承于基类的private和protected成员。
二、私有继承
【例2】任务1:
分析以下程序。
a)找出非法语句并在程序中注释非法的原因。
b)写出删除非法语句后程序的运行结果。
protected:
intptf;
voidSetxf(intw,intf)
pvx=w;
ptf=f;
}
voidPrint()
ptf="
ptf<
classDerive:
privateBase//私有继承
doublepvy;
doubleptz;
public:
intpd;
voidSetvalue(inta,intb,doublec,doubled)
pvx=a;
ptf=b+6;
Setxf(a,b);
pvy=c;
ptz=d;
pd=90;
voidOutput()
Print();
pvy="
pvy<
ptz="
ptz<
voidmain()
obj.Setvalue(1,6,5.3,3.8);
obj.Setxf(101,87);
obj.pvx<
obj.pvy<
obj.ptz<
obj.pd=68;
pd="
obj.pd<
“classDerive:
privateBase{}”表明这是一个私有继承,Base基类中有3个变量和两个函数:
私有pvx、保护ptf、公有函数Setxf()、公有函数Print()。
基类Base被私有继承之后,其protected成员在派生类中不能直接访问;
而protected成员和public成员都成了派生类的私有成员,只有派生类的成员才能直接访问;
派生类对象也不能直接访问继承自Base的protected成员和public成员。
私有继承中,基类中的protected、public成员都成为派生类中的private成员,派生类成员不能直接访问基类中的private成员,而派生类中的成员可以直接访问基类中的protected、public属性的成员;
派生类对象不能直接访问基类中的任何成员。
三、保护继承
【例3】任务2:
intpuz;
voidsetx(inta)
intgetx()
returnpvx;
protectedBase//保护继承
intpva;
intptb;
intpuc;
voidsetvalue(inta,intb,intc,intd,inte,intf)
setx(a);
pty=b;
puz=c;
pva=d;
ptb=e;
puc=f;
voidprint()
puz="
puz<
pva="
pva<
ptb="
ptb<
puc="
puc<
obj.setvalue(9,8,7,6,5,4);
obj.print();
obj.puc<
保护继承中,基类中的protected、public成员都成为派生类中的protected成员,派生类成员不能直接访问基类中的private成员,而派生类中的成员可以直接访问基类中的protected、public属性的成员;
派生类对象均不能直接访问基类中的任何成员。
【例4】任务3:
找出非法语句并在程序中注释非法的原因。
分析以下代码。
iostream>
usingnamespacestd;
classperson
charname[8];
chargender;
voidshow()
{cout<
name<
"
gender<
age<
address<
}
charaddress[20];
classteacher:
publicperson//公有继承
chartecpost[8];
chardepartment[20];
voidputout()
address<
age<
department<
tecpost<
protectedperson//保护继承
charstuno[15];
charschool[20];
name<
age<
stuno<
school<
classdoctor:
privateperson//私有继承
chartel[13];
charposition[15];
tel<
position<
teachera;
studentb;
doctorc;
a.name<
a.tecpost<
a.age<
a.address<
b.school<
b.name<
b.age<
b.address<
c.tel<
c.name<
c.age<
c.address<
(注:
可编辑下载,若有不当之处,请指正,谢谢!
)