欢迎来到天天文库
浏览记录
ID:44946292
大小:727.50 KB
页数:47页
时间:2019-11-05
《第14章多态性》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、第14章多态性南开大学非计算机专业理工科面向对象程序设计课程课程内容安排(2课时)多态性的概念虚函数抽象类应用实例小结学习指导214.1多态性的概念在介绍如何在程序中实现多态之前,我们先给出一个实例来理解什么是多态。【例14-1】未实现多态性的程序。#includeusingnamespacestd;classShape{public:voidDraw(){cout<<"Drawshape"<2、的概念classTriangle:publicShape{public:voidDraw(){cout<<"Drawtriangle"<3、pe514.1多态性的概念显然,我们并不希望看到这样的结果。我们希望当执行func(c)时调用Circle类的Draw()函数,当执行func(t)时调用Triangle类的Draw()函数,当执行func(r)时调用Rectangle类的Draw()函数。这种能够根据对象的实际类型来调用该对象所属类的函数、而不是每次都调用基类中函数的特性,就是本章所要介绍的多态性。614.2虚函数14.2.1先期绑定和动态绑定传统的面向结构的编译器所产生的函数调用,采用“先期绑定”的方式。所谓“绑定”就是建立函数调用和函数本体的关联。如果绑定发生于程序运行之前(由编译器和连接器完成),则称为“先期4、绑定”。面向对象程序设计语言采用“后期绑定”,也可叫“动态绑定”技术,即当调用某个对象的函数时,应该被执行的程序代码会根据对象的具体类型在执行期被确定下来。这是实现多态性的技术保证。想要实现多态,就要进行“后期绑定”,在C++中,实现“后期绑定”的机制是虚函数。714.2虚函数14.2.2虚函数的工作方式814.2虚函数在图14-1所示形状的类层次中,Circle类、Triangle类、Rectangle类都是从基类Shape派生出来的。每个类都有它自己的Draw()函数,并且绘制每种形状的Draw()函数都大不相同。当需要绘制形状时,把各派生类对象统一作为基类Shape的对象处理是5、一种很好的方法。只需要简单地调用基类Shape的Draw()函数,而不必关心对象的实际类型,程序会动态地确定(即在执行时确定)调用哪个派生类的Draw()函数。为了使这种行为可行,把基类中的函数Draw()声明为虚函数,然后在每个派生类中重新定义Draw()使之能够绘制合适的形状。虚函数的声明方法是在基类的函数原型前加上关键字virtual。914.2虚函数【例14-2】将例14-1进行简单的修改,在基类的Draw()函数前加上关键字virtual#includeusingnamespacestd;classShape{public:virtualvoidDraw6、()//将Draw()函数声明为虚函数{cout<<"Drawshape"<7、ut<<"Drawrectangle"<
2、的概念classTriangle:publicShape{public:voidDraw(){cout<<"Drawtriangle"<3、pe514.1多态性的概念显然,我们并不希望看到这样的结果。我们希望当执行func(c)时调用Circle类的Draw()函数,当执行func(t)时调用Triangle类的Draw()函数,当执行func(r)时调用Rectangle类的Draw()函数。这种能够根据对象的实际类型来调用该对象所属类的函数、而不是每次都调用基类中函数的特性,就是本章所要介绍的多态性。614.2虚函数14.2.1先期绑定和动态绑定传统的面向结构的编译器所产生的函数调用,采用“先期绑定”的方式。所谓“绑定”就是建立函数调用和函数本体的关联。如果绑定发生于程序运行之前(由编译器和连接器完成),则称为“先期4、绑定”。面向对象程序设计语言采用“后期绑定”,也可叫“动态绑定”技术,即当调用某个对象的函数时,应该被执行的程序代码会根据对象的具体类型在执行期被确定下来。这是实现多态性的技术保证。想要实现多态,就要进行“后期绑定”,在C++中,实现“后期绑定”的机制是虚函数。714.2虚函数14.2.2虚函数的工作方式814.2虚函数在图14-1所示形状的类层次中,Circle类、Triangle类、Rectangle类都是从基类Shape派生出来的。每个类都有它自己的Draw()函数,并且绘制每种形状的Draw()函数都大不相同。当需要绘制形状时,把各派生类对象统一作为基类Shape的对象处理是5、一种很好的方法。只需要简单地调用基类Shape的Draw()函数,而不必关心对象的实际类型,程序会动态地确定(即在执行时确定)调用哪个派生类的Draw()函数。为了使这种行为可行,把基类中的函数Draw()声明为虚函数,然后在每个派生类中重新定义Draw()使之能够绘制合适的形状。虚函数的声明方法是在基类的函数原型前加上关键字virtual。914.2虚函数【例14-2】将例14-1进行简单的修改,在基类的Draw()函数前加上关键字virtual#includeusingnamespacestd;classShape{public:virtualvoidDraw6、()//将Draw()函数声明为虚函数{cout<<"Drawshape"<7、ut<<"Drawrectangle"<
3、pe514.1多态性的概念显然,我们并不希望看到这样的结果。我们希望当执行func(c)时调用Circle类的Draw()函数,当执行func(t)时调用Triangle类的Draw()函数,当执行func(r)时调用Rectangle类的Draw()函数。这种能够根据对象的实际类型来调用该对象所属类的函数、而不是每次都调用基类中函数的特性,就是本章所要介绍的多态性。614.2虚函数14.2.1先期绑定和动态绑定传统的面向结构的编译器所产生的函数调用,采用“先期绑定”的方式。所谓“绑定”就是建立函数调用和函数本体的关联。如果绑定发生于程序运行之前(由编译器和连接器完成),则称为“先期
4、绑定”。面向对象程序设计语言采用“后期绑定”,也可叫“动态绑定”技术,即当调用某个对象的函数时,应该被执行的程序代码会根据对象的具体类型在执行期被确定下来。这是实现多态性的技术保证。想要实现多态,就要进行“后期绑定”,在C++中,实现“后期绑定”的机制是虚函数。714.2虚函数14.2.2虚函数的工作方式814.2虚函数在图14-1所示形状的类层次中,Circle类、Triangle类、Rectangle类都是从基类Shape派生出来的。每个类都有它自己的Draw()函数,并且绘制每种形状的Draw()函数都大不相同。当需要绘制形状时,把各派生类对象统一作为基类Shape的对象处理是
5、一种很好的方法。只需要简单地调用基类Shape的Draw()函数,而不必关心对象的实际类型,程序会动态地确定(即在执行时确定)调用哪个派生类的Draw()函数。为了使这种行为可行,把基类中的函数Draw()声明为虚函数,然后在每个派生类中重新定义Draw()使之能够绘制合适的形状。虚函数的声明方法是在基类的函数原型前加上关键字virtual。914.2虚函数【例14-2】将例14-1进行简单的修改,在基类的Draw()函数前加上关键字virtual#includeusingnamespacestd;classShape{public:virtualvoidDraw
6、()//将Draw()函数声明为虚函数{cout<<"Drawshape"<7、ut<<"Drawrectangle"<
7、ut<<"Drawrectangle"<
此文档下载收益归作者所有