第十二章 多态性与虚函数Word格式.docx
- 文档编号:18265330
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:38
- 大小:31.77KB
第十二章 多态性与虚函数Word格式.docx
《第十二章 多态性与虚函数Word格式.docx》由会员分享,可在线阅读,更多相关《第十二章 多态性与虚函数Word格式.docx(38页珍藏版)》请在冰豆网上搜索。
//Point的构造函数
Point:
:
Point(floata,floatb)
{x=a;
y=b;
//设置x和y的坐标值
voidPoint:
setPoint(floata,floatb)
//输出点的坐标
ostream&
output,constPoint&
p)
{output<
"
["
p.x<
"
p.y<
]"
endl;
returnoutput;
intmain()
{Pointp(3.5,6.4);
cout<
x="
p.getX()<
y="
p.getY()<
p.setPoint(8.5,6.8);
p(new):
p<
return0;
x=3.5,y=6.4
[8.5,6.8]
classCircle:
publicPoint
Circle(floatx=0,floaty=0,floatr=0);
voidsetRadius(float);
floatgetRadius()const;
floatarea()const;
operator<
constCircle&
private:
floatradius;
Circle:
Circle(floata,floatb,floatr)
:
Point(a,b),radius(r){}
voidCircle:
setRadius(floatr)
{radius=r;
floatCircle:
getRadius()const{returnradius;
area()const
{return3.14159*radius*radius;
output,constCircle&
c)
Center=["
c.x<
c.y<
],Radius="
c.radius<
area="
c.area()<
{Circlec(3.5,6.4,5.2);
originalcircle:
\nx="
c.getX()<
y="
c.getY()<
r="
c.getRadius()
<
c.setRadius(7.5);
c.setPoint(5,5);
newcircle:
\n"
c;
Point&
pRef=c;
pRef:
pRef;
x=3.5,y=6.4,r=5.2,area=84.9486
Center=[5,5],Radius=7.5,area=176.714
[5,5]
protected:
],r="
classCylinder:
publicCircle
Cylinder(floatx=0,floaty=0,floatr=0,floath=0);
voidsetHeight(float);
//设置圆柱高
floatgetHeight()const;
//读取圆柱高
floatarea()const;
//计算圆柱表面积
floatvolume()const;
//计算圆柱体积
friendostream&
(ostream&
constCylinder&
floatheight;
Cylinder:
Cylinder(floata,floatb,floatr,floath)
Circle(a,b,r),height(h){}
voidCylinder:
setHeight(floath){height=h;
floatCylinder:
getHeight()const{returnheight;
{return2*Circle:
area()+2*3.14159*radius*height;
volume()const
{returnCircle:
area()*height;
output,constCylinder&
cy)
cy.x<
cy.y<
],
r="
cy.radius<
h="
cy.height
\narea="
cy.area()<
volume="
cy.volume()<
{Cylindercy1(3.5,6.4,5.2,10);
\noriginalcylinder:
cy1.getX()<
y="
cy1.getY()<
cy1.getRadius()<
cy1.getHeight()<
cy1.area()
cy1.volume()<
cy1.setHeight(15);
cy1.setRadius(7.5);
cy1.setPoint(5,5);
\nnewcylinder:
cy1;
pRef=cy1;
\npRefasapoint:
Circle&
cRef=cy1;
\ncRefasaCircle:
cRef;
originalcylinder:
x=3.5,y=6.4,r=5.2,h=10
area=496.623,volume=849.486
newcylinder:
Center=[5,5],r=7.5,h=15
area=1060.29,volume=2650.72
pRefasapoint:
cRefasaCircle:
Center=[5,5],r=7.5,area=176.714
12.3虚函数
12.3.1虚函数的作用
例12.2基类与派生类有同名函数
string>
classStudent
Student(int,string,float);
//virtualvoiddisplay();
voiddisplay();
intnum;
stringname;
floatscore;
Student:
Student(intn,stringnam,floats)
{num=n;
name=nam;
score=s;
voidStudent:
display()
{cout<
num:
num<
\nname:
name
<
\nscore:
score<
\n\n"
;
classGraduate:
publicStudent
Graduate(int,string,float,float);
private:
floatpay;
voidGraduate:
name<
"
\npay="
pay<
Graduate:
Graduate(intn,stringnam,floats,floatp)
Student(n,nam,s),pay(p){}
{Studentstud1(1001,"
Li"
87.5);
Graduategrad1(2001,"
Wang"
98.5,563.5);
Student*pt=&
stud1;
pt->
display();
pt=&
grad1;
1001
name:
Li
score:
87.5
2001
Wang
98.5
如果voiddisplay();
改为virtualvoiddisplay();
则输出多一行:
pay=563.5
这种使用virtual修饰的成员函数称为虚函数。
当在派生类中定义了一个同名的成员函数时,只要该成员函数的参数个数和相应类型以及它的返回类型与基类中同名的虚函数完全一样,则无论是否为该成员函数使用virtual,它都将成为一个虚函数。
使用虚函数保证了在通过一个基类类型的指针(包括引用)调用一个虚函数时,C++系统对该调用进行动态关联,即此时调用的是指针变量指向的对象的同名函数。
但是,在通过一对象访问一虚函数时,则使用静态关联。
12.3.2静态关联与动态关联
12.3.3在什么情况下应当声明虚函数
12.3.4虚析构函数
例12.3基类中有非虚析构函数时的执行情况。
Point(){}
virtual
~Point(){cout<
executingPointdestructor"
Circle(){}
~Circle()
{cout<
executingCircledestructor"
intradus;
{Point*p=newCircle;
deletep;
executingPointdestructor
如果将
~Point(){cout<
改写为
virtual~Point()
{cout<
则输出结构为:
executingCircledestructor
显然这是我们想要的结果,因此,为了使用动态内存(newdelete),应将基类的析构函数声明为虚析构函数。
12.4纯虚函数与抽象类
12.4.1纯虚函数
virtualfloatarea()const{return0;
}//空虚函数
virtualfloatarea()const=0;
//纯虚函数
纯虚函数没有函数体,也没有给它分配内存。
它的定义留给派生类来做。
12.4.2抽象类
一个类可以说明多个纯虚函数,包含有纯虚函数的类称为抽象类。
一个抽象类只能作为基类来派生新类,不能说明抽象类的对象。
说明了纯虚函数的派生类仍是抽象类。
如果派生类中给出了基类所有纯虚函数的实现,则该派生类不再是抽象类。
//使用纯虚函数的例子。
#include<
iostream.h>
classnumber{
intval;
public:
number(inti){val=i;
virtualvoidshow()=0;
classhextype:
publicnumber{
hextype(inti):
number(i){}
voidshow(){cout<
hex<
val<
dec<
classdectype:
dectype(inti):
voidmain()
{
number*nump;
dectyped(56);
nump=&
d;
nump->
show();
hextypeh(15);
h;
56
f
12.4.3应用实例
例12.4虚函数和抽象基类的应用。
//声明抽象基类Shape
classShape
virtualfloatarea()const{return0.0;
}//虚函数
virtualfloatvolume()const{return0.0;
virtualvoidshapeName()const=0;
//声明Point类Point是Shape的公用派生类
classPoint:
publicShape
virtualvoidshapeName()const{cout<
}
//对纯虚函数进行定义
//声明Circle类
virtualfloatarea()const;
//对纯虚函数进行再定义
],r="
c.radius;
//声明Cylinder类
Cylinder(floatx=0,floaty=0,floatr=0,floath=0);
virtualfloatvolume()const;
get
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第十二章 多态性与虚函数 第十二 多态性 函数