虚函数和动态联编

虚函数和动态联编

ID:46867677

大小:222.50 KB

页数:52页

时间:2019-11-28

虚函数和动态联编_第1页
虚函数和动态联编_第2页
虚函数和动态联编_第3页
虚函数和动态联编_第4页
虚函数和动态联编_第5页
资源描述:

《虚函数和动态联编》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、虚函数多态性是面向对象设计语言的基本特征。仅仅是将数据和函数捆绑在一起,进行类的封装,使用一些简单的继承,还不能算是真正应用了面向对象的设计思想。多态性是面向对象的精髓,也是难点。在C++中,多态性是通过虚函数来实现的。#includeclassvehicle{intwheels;floatweight; public:voidmessage(void){cout<<"Vehiclemessage";} };classcar:publicvehicle{intpassenger_load; public:voidmessage(void){

2、cout<<"Carmessage";} };classtruck:publicvehicle{intpassenger_load;floatpayload; public:intpassengers(void){returnpassenger_load;} };classboat:publicvehicle{intpassenger_load; public:intpassengers(void){returnpassenger_load;}voidmessage(void){cout<<"Boatmessage";} };voidmain() {vehic

3、le*unicycle;car*sedan;trucksemi;boatsailboat;unicycle=newvehicle;unicycle->message();//输出Vehiclemessagedeleteunicycle;unicycle=newcar;unicycle->message();//输出Vehiclemessage//----------------------------------------sedan=(car*)unicycle;sedan->message();//输出Carmessagedeletesedan;//-------

4、---------------------------------semi.message();//输出Vehiclemessage??sailboat.message();//输出Boatmessage }指针的类型决定调用那一个成员函数因为指针的类型决定调用那一个成员函数,所以,一个vehicle*调用vehicle成员函数,即使它指向派生类的对象。同样,一个car*也调用car的成员函数。我们把这称为早期联编或静态联编,因为指针要调用那一个函数是在编译时就确定的。能不能通过该指针来调用派生类的成员函数呢?那么,当vehicle*指向派生类对象时,我们能不能通过该

5、指针来调用派生类的成员函数呢?在C++中,我们是可以作到的,这要用到C++的多态特性。也就是说,基类指针是调用基类的成员函数,还是调用派生类的成员函数,不是由指针的类型决定的,而是由指针指向的对象的类型决定的动态联编或迟后联编多态也称为动态联编或迟后联编,因为到底调用哪一个函数,在编译时不能确定,而要推迟到运行时确定。也就是说,要等到程序运行时,确定了指针所指向的对象的类型时,才能够确定。在C++中,动态联编是通过虚函数来实现的。函数调用是通过相应的函数名来实现的。对于源程序进行编译后,存放在内存中的可执行程序,函数实际上是一段机器代码,它是通过首地址进行标识和调用的

6、。例如,假定定义一个函数:voidfunc(){//…};我们可以用下面的语句调用这个函数:func();//调用func函数这是在源程序中调用函数的方法,它是用函数名操作的。函数执行的原理我们看看在可执行程序中函数调用是怎么操作的,我们用汇编语言来说明,因为汇编语言和机器语言(计算机可以直接执行的语言)是一一对应的。   在可执行程序中,函数调用使用下面的方法:call[xxxxx]xxxxx代表存放函数代码内存空间的首地址。call是汇编语句中的一条指令,意思是调用一个函数。实际操作过程是:保存当前地址、保护现场,跳转到xxxxx地址执行。正是基于这个原因,在C/

7、C++中的函数名是一个指针,该指针指向该函数段代码在内存中的首地址。早期或静态联编的原理如何将源程序中的函数调用和函数体(也就是在内存中该函数的机器代码)联系起来呢?这件工作是由编译器和连接程序来完成的。在C/C++语言中,函数调用在程序运行之前就已经和函数体(函数的首地址)联系起来。编译器把函数体翻译成机器代码,并记录了函数的首地址。在对函数调用的源程序段进行编译的时候,编译器知道这个函数名的首地址在那里(它可以从生成的标识符表中查到这个函数名对应的首地址),然后将这个首地址替换函数名,一并翻译成机器码。这种编译方法称为早期或静态联编。动态联编那么

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

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

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