CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
花落谁家,你作主! 盛大widget设计大赛英雄榜
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  ATL/ActiveX/COM

COM基本问

楼主kimryo(God is on my side)2001-11-03 20:26:49 在 VC/MFC / ATL/ActiveX/COM 提问

为什么所有的function都是virtual函数?既然有了interface,可以取得接口地址,何苦加一个用virtual加一个vtable? 问题点数:30、回复次数:20Top

1 楼ExplorerBoy()回复于 2001-11-03 21:21:51 得分 1

vtable   可是精华,慢慢体回去吧Top

2 楼wyzegg(蛋)回复于 2001-11-04 14:23:04 得分 0

这是最重要的  
  Top

3 楼latakia()回复于 2001-11-04 14:30:57 得分 1

com的vtable在c++中是通过虚函数和虚拟基类来实现的。  
  多看看书吧!Top

4 楼zenyivon(zenyivon)回复于 2001-11-04 20:04:13 得分 1

<<深入探索C++对象模型>Top

5 楼arxing(阿行)回复于 2001-11-05 09:12:44 得分 6

vtable就是接口,你所说的“接口的地址”就是vtable的地址。Top

6 楼yver()回复于 2001-11-07 08:22:00 得分 2

class   interace  
  {  
  public:  
          virtual   HRESULT   AddRef()   =   0;  
          virtual   HRESULT   Release()   =   0;  
          virtual   HRESULT   QueryInterface   =   0;    
  }Top

7 楼alwzh(虚竹)回复于 2001-11-07 18:44:03 得分 1

完全同意以上观点Top

8 楼bobqi(灰冷)回复于 2001-11-07 22:26:09 得分 7

接口的作用就是指明一个vtable  
  然后虚函数就在了vtable中的地址  
  程序才懂得如何通过接口调用函数,  
  然后在代码复用上就能够利用这种方法  
  不去为接口增加函数,而是通过增加新的接口来增加函数,  
  这是我个人的一点理解,不过好像有些东西没有说全,  
  希望高手指正  
   
  Top

9 楼bobqi(灰冷)回复于 2001-11-07 22:27:01 得分 2

补充,  
  利用虚函数就可以使得在定义接口的时候不用过多的考虑函数  
  的实现细节,而到了类定义的时候再来Top

10 楼scxy(小熊)回复于 2001-11-08 09:36:12 得分 2

用virtual得到一个vtable的指针,只有地址,不必关心实现细节,这样做到实现与接口的无关性Top

11 楼kimryo(God is on my side)回复于 2001-11-14 23:14:34 得分 0

还有人说否?Top

12 楼robinswan()回复于 2001-11-15 02:42:53 得分 2

如果这样理解可能会比较清晰,如果你在内存中创建一个类的实例,也就是在内存中创建了一个内存片,普通的函数的实现代码也是存在于同一个内存块中.  
  但是类的虚函数的实现代码是在另外的内存块中的,所以类的实例就必须有个虚表来保存虚函数的内存段的地址,也就是指针.这就是虚表了.Top

13 楼kimryo(God is on my side)回复于 2001-11-25 00:40:45 得分 0

给分Top

14 楼echolover(盈子)回复于 2001-11-25 11:08:03 得分 2

不同意robinswan的说法,建立一个类的实例时,在内存中创建的内存片中不包含member   function的代码。只有一个指向vtable的指针和data   member。Top

15 楼AndrewT(河马)回复于 2001-11-26 11:17:58 得分 0

只补充一点,由于各个商业的C++编译器只有在vtable的格式上是一样的,所以采用虚函数声明接口,就可以实现接口的编译器无关性。这对COM是很重要的。Top

16 楼lixiner(大汤姆狼)回复于 2001-11-26 11:27:08 得分 0

在C++的虚拟函数可以完美的实现com的接口特性!  
  不一定非要用,例如C语言,只要能实现  
  接口的标准就行了Top

17 楼kimryo(God is on my side)回复于 2001-12-16 16:35:03 得分 0

还有,ATL的接口类的ATL_NO_VTABLE是什么意思?Top

18 楼finalwish(gogo)回复于 2001-12-16 19:23:52 得分 2

      对于COM的继承问题,对于microsoft是个难题,由于com中有个vtable,这对于本地机的COM的继承来说很容易解决,直接调用父接口的vtable,但对于远程COM的继承来说,这就是不现实的。  
  所以microsoft只好用了一个替代品聚合来模拟继承。Top

19 楼lisush(西木)回复于 2001-12-24 15:35:36 得分 1

建议去看《深入浅出MFC》  
  这本书对多态和虚拟有比较精彩的介绍Top

20 楼yoshiyan(耀奇(冬季限定版))回复于 2001-12-27 08:53:26 得分 0

ATL_NO_VTABLE就是告诉编译器不要为你要定义的类生成VTABLE了,这样可使代码小些.Top

相关问题

  • COM的基本问题
  • 基本问题:
  • 基本问题
  • 基本问题!
  • 基本问题
  • 基本问题
  • 基本问题
  • 基本问题
  • TC++基本问题
  • 最基本问题

关键词

  • c++
  • 接口
  • 函数
  • 内存
  • 编译器
  • 代码
  • 指针
  • 虚拟
  • com
  • virtual

得分解答快速导航

  • 帖主:kimryo
  • ExplorerBoy
  • latakia
  • zenyivon
  • arxing
  • yver
  • alwzh
  • bobqi
  • bobqi
  • scxy
  • robinswan
  • echolover
  • finalwish
  • lisush

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo