【C++学习笔记】多态性

今天我们来讲一下面向对象的程序设计的第三个特点:多态性。

所谓多态性就是不同对象收到相同的消息时,产生不同的动作。多态性有下面两种描述:
1.具有不同功能的函数可以用同一个函数名。(重载、虚函数)
2.向不同的对象发送同一个消息,不同对象在接收消息后产生的行为不同。

多态有三种实现形式:
函数重载
运算符重载
虚函数

多态的分类:

在这里插入图片描述

联编的概念

联编就是把函数名和函数代码连接在一起的过程。

静态与动态的概念

静态联编:在编译阶段完成的联编(由于是在编译开始的时候就已经完成,所以在程序运行过程中是固定不会变的。)
动态联编:在运行阶段完成的联编。(可以在程序运行中动态改变)

由于引出了静态联编与动态联编的概念,接下来再与多态性结合引出下面概念:
在静态联编时体现的多态就被称为编译时的多态。此时,系统将实参与形参进行匹配,对于同名重载函数便根据参数上的差异进行区分,然后进行联编。从而实现多态性。
在动态联编时体现的多态称为运行时的多态。此时,当函数调用到某一程序名时,才去寻找和连接其程序的代码,对面向对象的程序设计而言,就是接收到某一消息后,才去寻找相应连接方法。

打个比方:把计算机想象成一个维修工,有一类维修工习惯在上工前先把工具组装调试好再一起带到现场(编译时的多态)。而有一类维修工习惯人先过去,看到实际问题后再慢慢组装工具,根据现场实际问题组装不同的工具(运行时的多态)。

这样比喻我们就容易看出这两种方式处理问题的利弊了:第一类维修工在工作时效率更高(工具都已经准备好了,直接使用就好了)但是一但现场出现了超出维修工预料的问题,手头工具不能用了,就没办法改变了。第二类维修工在工作时可以根据实际问题灵活的组装工具,但是每次使用都要组装一次工具,所以工作效率低。

在程序中编译时的多态保证了效率但灵活性差,运行时的多态保证了灵活性但牺牲了效率。

第一类维修工:编译性语言(C、C++…)
第二类维修工:解释性语言(python…)

但是
C++:年轻人才做选择,大人全都要!

C++虽然是编译性语言,但是C++引入了虚函数机制,使得C++拥有了动态联编的功能。也就是说,C++是一个静态与动态结合的语言。
在C++中,编译时的多态性体现在函数的重载和运算符重载。运行时的多态是利用虚函数。

猜你喜欢

转载自blog.csdn.net/weixin_43819313/article/details/84643207