c++语言的动态联编技术剖析

c++语言的动态联编技术剖析

ID:12418310

大小:25.00 KB

页数:7页

时间:2018-07-17

c++语言的动态联编技术剖析_第1页
c++语言的动态联编技术剖析_第2页
c++语言的动态联编技术剖析_第3页
c++语言的动态联编技术剖析_第4页
c++语言的动态联编技术剖析_第5页
资源描述:

《c++语言的动态联编技术剖析》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、C++语言的动态联编技术剖析第22卷第6期V01.22No.6龙岩师专JournalofLongyanTeachersCollege2004年12月Deeember2O04C++语言酌动态联编技市剖析郑金彬摘要:通过对C++语言的多态性机制概念,实例的阐述,引出多态性的实现得益于其中的动态联编技术.进而对动态联编的关键技术虚函数表进行剖析,解析了动态联编的过程及其技术要领.关键词:多态性;动态联编;虚函数表中图分类号:TP312文献标识码:B文章编号:1672—044X(2004)06—0017—02多态性(polymorphism)是面向对象的核心.

2、它的最主要的思想就是可以采用多种形式的能力,通过一个用户名字或者用户接口完成不同的实现,也就是说一个名称可以具有多种语义.通常多态性被简单地描述为"一个接口,多个实现".利用多态性,用户只需发送一般形式的消息,而将所有的实现留给接收消息的对象,对象根据所接受到的消息而做出相应的动作.1联编的概念在C++中,联编(binding)就是使一个计算机程序的不同部分彼此关联的过程.在这个过程中将对每个函数调用分配内存地址,并且对外部访问也分配正确的内存地址.根据进行联编所处阶段的不同.可分为两种不同的联编方法:静态联编和动态联编(或称先前联编和滞后联编).在编

3、译阶段决定执行哪个同名的被调用函数,称为静态联编.静态联编在编译阶段就必须了解所有的函数或模块执行所需要检测的信息,它对函数的选择是基于指向对象的指针(或者引用)的类型.反之在编译阶段不能决定执行哪个同名的被调用函数,只在执行阶段才能依据要处理的对象类型来决定执行哪个类的成员函数,这称为动态联编,动态联编对成员函数的选择不是基于指针或者引用,而是基于对象类型,针对不同的对象类型将做出不同的编译结果.C++中一般情况下联编是静态联编,但是当涉及到多态性和虚函数时就应该使用动态联编.2C++多态性机制实例多态性是面向对象编程的重要特征之一.多态性在C++里

4、面具体的表现为通过基类指针访问派生类的函数和方法.以下是一段简单的代码:#include<iostream.h>usingnamespacestd;classBase{inta:public:,'irtualvoidfun1()fcout<<"Base::fun1()"<<endl;),irtualvoidfun2(){eout<<"Base::fun2()一<<endl;1virtualvoidfun3(){cout<<"Base::fun3()"<<endl;)收稿

5、日期:2003--09_-02】;classA:publicBase{inta:public:voidfunl(){cout<<"A::fun1()"<<endl;)voidfun2(){cout<<"A::fun2()"<<endl;)】;voidfoo(Base&obj){obj.fun1():obj.fun2():obj.fun3():)voidmain(){Baseb;Aa:foo(b);foo(a):)运行结果为:Base::fun1()Base::fu0.2()Base::fun3()

6、A::funl()A::fun2()Base::fun3()以上实例仅通过基类的接口,程序调用了正确的函数.它就好像知道我们输入的对象的类型一样!那么,编译器是如何知道正确代码的位置呢?其实,编译器在编译时并不知道要调用的函数体的正确位置,但它插入了一段能找到正确的函数体的代码.这称之为晚捆绑(1atebinding)或运行时捆绑(runtimebinding)技术.3虚函数表VTABLE的应用3.1虚函数表VTABLE概述l7通过virtual关键字创建虚函数能引发晚捆绑,编译器在幕后完成了实现晚捆绑的必要机制.它对每个包含虚函数的类创建一个虚函数表

7、(称为VTABLE或V一表),所谓虚函数表,就是编译程序替每个使用虚函数的类构造一个函数指针数组,用于放置虚函数的地址.在每个包含虚函数的类中,编译器秘密地放置了一个称之为vpointer(缩写为VP1'R)的指针,指向这个对象的ⅥBLE.所以无论这个对象包含一个或是多少虚函数,编译器都只放置一个VPTR即可.VPrR由编译器在构造函数中秘密地插入的代码来完成初始化.指向相应的VTABLE,这样对象就"知道"自己是什么类型了.VPTR都在对象的相同位置,常常是对象的开头.这样,编译器可以容易地找到对象的VTABLE并获取函数体的地址.编译器在执行过程中

8、遇到virtual关键字的时候,将自动设置动态联编需要的机制.首先为这些包含virtual函数

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

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

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