零点起飞学C之灵活的代码——多态

零点起飞学C之灵活的代码——多态

ID:39527546

大小:433.86 KB

页数:52页

时间:2019-07-05

零点起飞学C之灵活的代码——多态_第1页
零点起飞学C之灵活的代码——多态_第2页
零点起飞学C之灵活的代码——多态_第3页
零点起飞学C之灵活的代码——多态_第4页
零点起飞学C之灵活的代码——多态_第5页
资源描述:

《零点起飞学C之灵活的代码——多态》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、第16章灵活的代码——多态多态指同一个实体同时具有多种形式。如果一个语言只支持类而不支持多态,只能说它是基于对象的,而不是面向对象的。学习本章,读者可以掌握面向对象开发中重要的多态,这样就能够用相似的接口实现不同功能。16.1什么是多态多态(polymorphism),从字面来理解就是“多种形态,多种形式”。它是一种将不同的特殊行为泛化为单个特殊记号的机制。在面向对象中将多态描述为:向不同的对象发送同一个消息,在接收后,不同的对象产生不同的行为。这里的消息即调用,行为即实现。生活中的多态现象非常普遍。例如,几个重名的人在一起,这就是一种多态的

2、现象。他们虽然名字相同,但却是完全不同的个人。如果有人喊他们的名字,这就相当于系统发出了一个消息,每个人都会对这个消息做出不同的反应。如果认为是呼叫自己,则予以响应;否则就置之不理。这就是说,“名字呼叫”这个消息所处的环境直接决定了由哪个对象来响应,即环境具体决定了相同名字掩盖下的不同实现。多态的性质可以从3个方面来理解。1.名字多态对象都是同名的,即多个对象共享了单个的特殊记号,具有相同的调用标记。无论使用哪个对象,都使用一致的名字来调用。2.实现虽然这些对象具有相同的名称,但是却具有特例化的行为,每个对象的实现都完全不一样。如何从相同的名

3、称调用不同的实现,这要依赖对象的参数和对象所处的位置来决定。3.环境环境是指被调用对象所处的上下文环境。调用多态对象时,传给它的参数的个数、类型,以及该多态对象所属对象的不同,就是多态对象的生存环境。这些因素具体决定了调用的是哪个实现,区分了相同名称掩盖下的不同实现。C++的多态性具体体现在运行和编译两个方面。在程序运行时的多态性通过继承和虚函数来体现,这属于动态多态性。动态多态性直到运行时才能确定要调用哪个对象,这叫后期绑定,其主要优点是灵活,但速度慢。后期绑定使程序员编写的程序可以对程序运行时发生的时间做出响应,而不必编写处理大量偶发事件

4、的代码。在程序编译时的多态性体现在重载上,这是静态的多态性。静态多态性在编译的过程中就知道调用某个函数所需要的全部信息,因此可以在编译时就将对象和函数绑定在一起。这种机制叫早期绑定,其优点是高效,函数调用速度快。16.2宏的多态宏就是替换,即在编程时用一个标记替代一个字符串,并在编译时将该标记替换为对应的字符串。它由#define定义,有带参数和不带参数两种。不带参数的宏是一种纯粹的字符串替换,带参数的宏类似于内联函数。带参数的宏在定义时,并没有规定它的参数必须是什么样的类型。这就意味着该宏仅仅是定义了一个处理参数的模板,具体完成执行什么样的

5、动作由参数的类型来决定。【示例16-1】自定义断言和加法两个宏,这两个宏可像函数一样使用。分析:该示例定义了两个宏_MY_ASSERT_和_ADD_,前者是一个断言,后者是一个加运算。断言宏的第一次调用中,参数为整数,故执行的是判断整数是否为0的操作。第二次调用中参数为指针,故执行的是判断指针是否为空的操作。加运算的第一次调用中,两个参数都是整数,执行的是整数加运算。第二次调用中,参数是指针和整数1,执行的是指针地址的增1,即指向数组的下一个整数。最后一次调用中,两个参数都是字符串,故进行的是串的连接。说明:严格来讲宏多态不能算是多态,因为

6、多态性需要在调用对象和被调用对象之间进行绑定,这种绑定分为静态和动态两种。但是宏只是一段代码的替换,没有对象的存在,所以不能进行绑定操作。但是从表面来看,它确实像一个多态的函数。从该示例可以看出,宏多态的实现依赖于参数的类型,参数类型的不同决定了宏完成什么样的功能。这实质是因为宏是在编译时替换的,这种替换是不加任何改动的替换。因此,替换后,相当于在代码中出现宏的地方直接写了一段代码。显然,有什么样的参数,就会有什么样的动作。16.3虚函数虚函数就是虚拟函数,它在基类中被声明为虚拟的,并在派生类中被定义,实现其具体操作。虚函数实现了不同派生层次

7、对同一函数的多态实现,本节将详细讲解虚函数的概念。16.3.1虚函数的作用声明一个函数是虚拟的,只要在它的声明前加关键字virtual即可。把一个函数声明为虚拟的,将使得对该函数的调用变成后期绑定。直到运行时,才能由发出调用动作的对象来决定要调用的是哪个派生层次的函数。具体做法是首先在基类中定义一个虚函数,即用virtual修饰。当从此基类派生子类时,子类重新定义基类的函数以满足自己的特殊要求。如果通过对象来访问虚函数时,方式和结果与普通函数一样。若用指针来访问才会体现虚函数的强大功能。它允许将子类对象的地址赋值给父类对象的指针,当调用虚函数

8、时,该父对象将根据当前赋给它的子对象的不同而调用不同的虚函数的实现。当不同子类的对象指针赋值给父类指针时,就可通过父类指针调用同一名称的函数,但却实现不同的行为。这

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。