静态联编和动态联编
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
=========================定义======================= ==
将一个调用函数连接上正确的被调用函数,这个过程就叫做函数的联编,简称联编。在C++中,一共有两种联编的方式:
1.静态联编
#define:静态联编是指联编工作出现在编译连接阶段。
#特点:①静态联编就是指被调用函数和执行调用函数之间的关系以及它们在内存中的地址在编译的时候已经确定好了,运行时不会发生变化。
②由于对象不用对自身进行跟踪,因此速度浪费比较小,但是灵活性较差。
2.动态联编
#define:动态联编是指在程序运行的时候才进行的联编工作。
#特点:①由于编译程序在编译阶段并不能确切知道将要调用的函数,只有在程序执行时才能确定将要调用的函数。要确切之道该调用的函数,就必须要求联编工作在程序运行时才能进行。
②虽然可以追踪对象,灵活性较强,但是速度浪费严重。
我们先来看一下这个程序的运行结果:
上面这个结果很好理解吧,我就不解释了。但是如果我们这里把程序33行的注释去掉,把32行注释起来。那么程序运行的结果就会出现如下的情况:
这个就很奇怪了。我们的初衷是想用一个父类指针来指向一个子类对象。但是最后调用的print
这样,我们在程序的第10行上加上了virtual关键字。它就将基类的print()函数声明成了虚函数。这样一来,我们就可以调用子类的print()函数了,上图发真相!
=========================virtual与联编之间的关系========= ================
相对于例1来讲,在这里面调用的关系就是静态联编,因为在程序的编译阶段就已经把对象和它们所指向的函数紧紧地联系在一起了,运行的时候自然就不会有任何改变。而对于例2来讲,由于在父类的[rint()函数前面加上了关键字virtual,那么这个时候父类中的prin t()函数就变成了虚函数,虚函数就可以实现运行时的动态联编。这是因为virtual会让编译器自动地区寻找与之对应的对象,所以输出才会于红框所示,“son's age is 22”。
特别注意一点!!!只有在使用指针或者是引用的时候,才能够实现动态联编。