| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 690 人关注过本帖
标题:[原创]简单谈谈组件及COM---对象模型图
只看楼主 加入收藏
Aviyeah
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2006-10-22
收藏
 问题点数:0 回复次数:1 
[原创]简单谈谈组件及COM---对象模型图
我发现没有一张图,是说明不了问题,不过贴子,放不了图片,没办法先,上传一张吧.
在第一贴,我们最后谈到对象模型,我现在谈谈这方面的问题。
就我所知的对像模型有三种:简单对像模型,表格驱动对象模型,和C++对像模型。
不过在真正用于产品的也不过是后两种,我不知道第一种有没有真正被应用(读者如果知道请告诉我一声),表格驱动对象模型被CORBA(common object request broker architecture)和SOM (system object model) 采用,而C++对象模型被COM所采用。
先看看表格驱动对象模型:
图中的表格驱动模型对象中,左边的就是一个对象了,本对象由两部组成(其实不只这些,因为如果对象是继承而来的话,会多些数据),首先看看dataPtr,它是一个指针,指向右边的表格,而这个表格,放的就是成员变量了(也就是说类中的属性)例如,data1,data2.而funPtr
放的也是一个指针,不过这个指针所指向的表格有点特殊,因为,表格的每一项的大小都是相等的,一般是4个字节为一项,放的是一个成员函数的入口地址,不过要注意,它所放的虚函数的入口地址,也就是virtual member function而不是nonvirtual member function.这些入口函数的入口地址,在编译时由编译器写入。而funPtr则是当程序运行,并创建对象时由构造函数,或都=拷贝运算符动态写入的。我们再仔细看看这个函数表格的第一项,我没有给它写上任何东西,那是因为,它能常不会放函数的入口地址,它可能会放一些指向别的对像的指针,如type_info类型的对象,这是一个描述一个对像的RTTI(runtime type info)的对象,在它的前而还可能是会有一些项放的即不是对象指针也不是函数入口地址,它放的是一些偏移量(当这个对像是由虚拟继承而来的话),Sun公司,及cfont的某个版本的编译器,如果我没记错的话就是用这个原理来实现类的虚拟继承,不过MSVC++的编译不是这样的,这里不想多说,因为我们的主题不在这。
如了说到了这里我想你会想到一我在第一贴里提到的,组件与客户程序,只要接口不变,那么后续的组件,对于客户原来的应用程序,不用再编译,链接就能使用的原理所在了。答案就在于对像的funPtr的指针上,它并不是由编译器给固定成某个值,而是随着组件程序的改变而不断的改变的,它的值是在过行时才确定的。所以客户的应用程序不用编译,链接就能远行,也就是说,组件的方法,一定要用C++的虚函数才能实现。要有一层的间隔才能灵活,富有弹性。我们还注意到,表格驱动的对象模型连数据都是间接访问,说明它也能让客户时进行直接访问,不仅仅局限于接口能让客户使用。现在我们来看看C++的对象模型,它的数据并没有像表格驱动的对象模型那样具用间接性,所以,客户就不能直接访问,而只有接口了,这就是为什么COM只能提供接口让客户访问的原因,那么是不是C++对象模型编出来的组像就不能提供,属性访问呢。就我个人来说,不是的。C++对象模型同样能编出即能提供接口也能提供性性访问的组件,不过这种组件就不能再称为COM了吧。不过我不敢下结论因为我没有看过COM规范的原文,不知道COM是不是也把直接拱属性访问作为它的标准。下一次我将编一个支持属性直接访问的组件(提示,得用到虚拟继承)
搜索更多相关主题的帖子: COM 组件 模型 对象 
2006-10-23 19:59
Aviyeah
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2006-10-22
收藏
得分:0 
我晕,图没传上,再传一次
lbD6ZKQ4.rar (3.76 KB) [原创]简单谈谈组件及COM---对象模型图


2006-10-23 20:00
快速回复:[原创]简单谈谈组件及COM---对象模型图
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.034525 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved