c++ 、java 、 oc 对象模型比较(干货)

来源:互联网 发布:看图识番号软件下载 编辑:程序博客网 时间:2024/06/03 12:56

最近突然想起对oc的对象模型比较清楚,那么c++、java怎样实现的呢?

参考文献:

  1. http://www.cnblogs.com/skynet/p/3343726.html  吴秦(Tyler)c++对象模型
  2. http://blog.csdn.net/jamesmf/article/details/7710149  
  3. 深入理解java虚拟机


1.  先来易理解的,泛型的实现?

c++的泛型,采用编译期处理,添加对应的函数名+参数名,运行期直接调用;

java 泛型,是伪泛型,采用编译期类型检查等,JVM实际加载class的时候,采用类型擦除(生成的class文件中为数据的原始类型)

oc无

2.单继承

c++继承(较复杂,类似表驱动模型),这里先假定为简单的单继承,无覆盖,无多继承,无虚继承。

基本模型:虚函数表指针+非静态数据内存单元(连续)

 无覆盖:       基类不受影响            直接扩充子类的虚函数表(先父类,后子类虚函数)

java 继承  待续

oc 继承,oc实际模型为一个结构体,包括class对象和meta Class(貌似有些跟java相似),每个对象均含有  superclass和isa指针,分别指向父类class地址和对象指针


3 重载(静态绑定)

几个实现差不多

1.c++  编译器函数名+参数类型

2.java 静态分配,依赖静态类型 

3.oc也差不多,类名+函数名+。。。

4 动态绑定(运行时)

c++虚函数表,较复杂

覆盖单继承:基类:本身 子类:父类虚函数(被覆盖的方法用子类方法替换)+无覆盖的子类虚函数

覆盖多继承:子类:二维表 父类1虚函数(被覆盖的方法用子类方法替换)+无覆盖的子类虚函数,其余 只列举父类虚函数表

oc 

struct _class_t {

struct _class_t *isa;

struct _class_t *superclass;

void *cache;

void *vtable;

struct _class_ro_t *ro;

};

vtable可见也是虚函数表+cache表

java invokevirtural解析 (还是建立虚表+接口方法表)

在oc和java中实现多继承采用接口

待续。。。。        




0 0