动态绑定C++_Java_ObjectC

动态绑定C++_Java_ObjectC

ID:42658304

大小:253.47 KB

页数:6页

时间:2019-09-19

动态绑定C++_Java_ObjectC_第1页
动态绑定C++_Java_ObjectC_第2页
动态绑定C++_Java_ObjectC_第3页
动态绑定C++_Java_ObjectC_第4页
动态绑定C++_Java_ObjectC_第5页
资源描述:

《动态绑定C++_Java_ObjectC》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、C++的虚函数的动态绑定虚函数是通过virtualtable来实现的。在这个表中,主要是一个类的虚函数的地址表,其内容真实反应实际的函数。这样,在有虚函数的类的实例中这个表被分配在了这个实例的内存中。所以,当我们用父类的指针来操作一个子类的时候,就由虚表来指明实际所应该调用的函数。假设我们有这样一个类:classBase{public:virtualvoidf(){cout<<"Base::f"<

2、out<<"Base::h"<

3、//Base::f()(Fun)*((int*)*(int*)(&b)+1);//Base::g()(Fun)*((int*)*(int*)(&b)+2);//Base::h()C++编译器应该保证虚函数表的指针存在于对象实例中最前面的位置(这是为了保证取到虚函数表有最高的性能,特别是在有多层继承或多重继承的情况下)。non-public的虚函数也存在于虚函数表中,所以可以使用访问虚函数表的方式来访问这些non-public的虚函数。上述类的实例的虚函数表为:虚函数表的结束节点在不同的编译器下是不同的:在window

4、s下,这个值是NULL;在linux下,这个值如果是1表示还有下一个虚函数表,如果是0表示是最后一个虚函数表。l一般继承(无虚函数覆盖)对于实例Derived的虚函数表如下:1)虚函数按照其声明顺序放于表中;2)父类的虚函数在子类的虚函数前面。l一般继承(有虚函数覆盖)对于实例Derived的虚函数表如下:1)覆盖的f()函数被放到了虚表中原来父类虚函数的位置;2)没有被覆盖的函数依旧。l多重继承(无虚函数覆盖)对于子类实例中的虚函数表,是如下:1)每个父类都有自己的虚表;2)子类的成员函数被放到了第一个父类的虚表中

5、。l多重继承(有虚函数覆盖)子类实例中的虚函数表的图:Java的后期绑定Java中的方法只有final,static,private和构造方法是前期绑定。其它方法都是后期绑定。动态绑定的过程:1)虚拟机提取对象的实际类型的方法表;2)虚拟机搜索方法签名;3)调用方法。Java中的后期绑定是由JVM来实现的,不用去显式地声明它,而C++则必须明确地声明某个方法具备后期绑定(用virtual关键字)。JAVA虚拟机规范并没有规定JAVA对象在堆里是如何表示的。对象的内部表示也影响着整个堆以及垃圾收集器的设计,它由虚拟机的

6、实现者决定。JAVA对象中包含的基本数据由它所属的类及其所有父类声明的实例变量组成。只要有一个对象引用,虚拟机就必须能够快速地定位对象实例的数据。另外,它也必须能通过该对象引用访问相应的类数据(存储于方法区的类型信息),因此在对象中通常会有一个指向方法区的指针。当程序在运行时需要转换某个对象引用为另外一种类型时,虚拟机必须要检查这种转换是否被允许,被转换的对象是否的确是被引用的对象或者它的父类型。当程序在执行instanceof操作时,虚拟机也进行了同样的检查。所以虚拟机都需要查看被引用的对象的类数据。不管虚拟机的实

7、现使用什么样的对象表示法,很可能每个对象都有一个方法表因为方法表加快了调用实例方法时的效率。但是JAVA虚拟机规范并未要求必须使用方法表,所以并不是所有实现中都会使用它。下面是一种JAVA对象的内存表示:方法数据存放在类的方法区中,包含一个方法的具体实现的字节码二进制。方法指针直接指向这个方法在内存中的起始位置,通过方法指针就可以找到这个方法。方法表是一个指向方法区中的方法指针的数组。方法表中不包含static、private等静态绑定的方法,仅仅包含那些需要动态绑定的实例方法。在方法表中,来自超类的方法出现在来自子

8、类的方法之前,并且排列方法指针的顺序和方法在class文件中出现的顺序相同,这种排列顺序的例外情况是,被子类的方法覆盖的方法出现在超类中该方法第一次出现的地方。和C++的虚函数在虚表的排列顺序很相似。ClassBase{publicBase(){}publicvoidtest(){System.out.println(“initBase”);}

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

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

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