首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > C/C++ > ATL界面类——兼谈多态与泛型
【标  题】:ATL界面类——兼谈多态与泛型
【关键字】:ATL
【来  源】:http://blog.csdn.net/xushiweizh/archive/2006/10/21/1343410.aspx

ATL界面类——兼谈多态与泛型

由于业余时间相对比较少,并且接下来要出差(大约十天左右),看样子winxcn.com短期内不能出来。为了WINX的文档不至于遥遥无期,我决定还是现在开始在blog上连载WINX的核心文档。或许对于这些文档而言,blog不是一个很好的载体,因为blog更关注的是社会性,强调的是参与,而体系性较差。

这是开篇第一篇。你可能觉得惊奇——不是要讲WINX吗?怎么,讲ATL来着?勿须奇怪,WINX是基于ATL/WTL的,所以,在讲WINX的原理之前,先要了解ATL的基本概念,它们一定程度上是相通的。

ATL/WTL的界面开发,网上的教程还是少了点。相信大家都知道《MFC程序员的WTL开发指南》,这的确是一套难得的好教材。作为WINX的入门篇,我们这一篇是回顾《MFC程序员的WTL开发指南》第一篇:“ATL界面类”(注:为了不至于重复制造轮子,我这里不再赘述该文章已经叙述较为详细的一些技术细节)。

接触ATL/WTL久了,类似下面这样的代码你一定见得多了:

class MyClass : BaseClassT<MyClass>
{
};

把派生类MyClass,作为模版参数传递给基类BaseClassT,这种写法多多少少显得有点古怪。但这是合法的。之所以要这样,是因为我们要实现“编译期的晚绑定”(ATL界面类中把它称为“编译期间的虚函数调用机制”,这是不太准确的说法)。

基于虚函数技术的“运行期(Runtime)的晚绑定”大家都已经很熟悉了,这也就是OOP中所谓的“多态”。而基于模板技术,所依赖的并非vtable,而是类型不确定型(类型晚绑定),来达到“编译期的晚绑定”。这也就是所谓的“泛型”。

选择“多态(虚函数技术)”,还是选择“泛型(模板技术)”?

模板的好处是“零开销”——即额外的时间、空间开销均为零。而虚函数技术在时间上多了一次间接调用(由vptr找到vtable中相应的函数地址),并导致inline失效(无法展开);在空间上每个类对象多了4字节(这里假设是32bit系统)的vptr,全局多了一个vtable(大小与该类的虚函数个数有关)。

虚函数的好处是“可定义二进制规范”,从而建立语言无关的调用约定。这就是COM(组件对象模型)技术关注的内容。进一步来说,虚函数技术比较适合应用于大型程序中的模块划分,用以描述组件间调用契约——interface(接口)。

我并不是模板技术的推崇者。应当认识到,模板与虚函数技术一样,只适合有限的场合。WINX中,消息分派机制使用了模板,是因为它是最适合的人选。

作为结束,我提醒读者,理解泛型中的“编译期的晚绑定”是重要的,如果你希望深入理解WINX的话。下一节我们开始进入最关键的章节——WINX的消息机制。
 
求完数及相关的完数 介绍:【上一篇】
成为嵌入式程序员应知道的0x10个问题:【下一篇】
【相关文章】
  • 征询Ajax&Atlas技术团队发展建议
  • 深入Atlas系列:Web Sevices Access in Atlas示例(2) - 自定义JavaScriptConverter处理循环引用对象
  • “深入Atlas系列”文章导读
  • 深入Atlas系列:Web Sevices Access in Atlas(6) - 对于复杂数据类型的支持(下)
  • 深入Atlas系列:Web Sevices Access in Atlas(5) - 对于复杂数据类型的支持(上)
  • 深入解析ATL(第二版ATL8.0)(2.1-2.2节)
  • 深入Atlas系列:Web Sevices Access in Atlas(3) - 服务器端支持(下)
  • 深入Atlas系列:Web Sevices Access in Atlas(4) - 特别的访问方式
  • VS 2005中文版用户请谨慎使用我提供的Atlas Xml Scripts Intellisense方法
  • Atlas 学习记录
  • 【随机文章】
  • 如何限制某个用户访问oracle的进程(/processes?)数量?
  • C语言基础(06-逻辑运算符和逻辑表达式)
  • 改成wav试试吧,我的能力就到这了,期待高手吧
  • 简析配置文件操作
  • 在VC中调用DLL文件
  • DotNet软件开发框架
  • AutoCAD的启动与退出
  • 关于Java反射机制
  • 思科Cisco2600路由器型号参数及模块
  • 数1的个数
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.