ATL---style模板
来源:互联网 发布:手机注册淘宝店铺流程 编辑:程序博客网 时间:2024/06/06 18:58
以下为MFC程序员的WTL指南(2)中部分内容,对此表示对作者和译者的感谢!
ATL-style 模板
即使你能够毫不费力地阅读C++的模板类代码,仍然有两件事可能会使你有些头晕,以下面这个类的定义为例:
这样作是合法的,因为C++的语法解释说即使CMyWnd类只是被部分定义,类名CMyWnd已经被列入递归继承列表,是可以使用的。将类名作为模板类的参数是因为ATL要做另一件诡秘的事情,那就是编译期间的虚函数调用机制。
如果你想要了解它是如何工作地,请看下面的例子:
这句代码static_cast(this) 就是窍门所在。它根据函数调用时的特殊处理将指向B1类型的指针this指派为D1或D2类型的指针,因为模板代码是在编译其间生成的,所以只要编译器生成正确的继承列表,这样指派就是安全的。(如果你写成:class D3 : public B1<D2>
就会有麻烦) 之所以安全是因为this对象只可能是指向D1或D2(在某些情况下)类型的对象,不会是其他的东西。注意这很像C++的多态性(polymorphism),只是SayHi()方法不是虚函数。
要解释这是如何工作的,首先看对每个SayHi()函数的调用,在第一个函数调用,对象B1被指派为D1,所以代码被解释成:
由于D1没有重载PrintClassName(),所以查看基类B1,B1有PrintClassName(),所以B1的PrintClassName()被调用。
现在看第二个函数调用SayHi(),这一次对象被指派为D2类型,SayHi()被解释成:
这一次,D2含有PrintClassName()方法,所以D2的PrintClassName()方法被调用。
这种技术的有利之处在于:
- 不需要使用指向对象的指针。
- 节省内存,因为不需要虚函数表。
- 因为没有虚函数表所以不会发生在运行时调用空指针指向的虚函数。
- 所有的函数调用在编译时确定(译者加:区别于C++的虚函数机制使用的动态编连),有利于编译程序对代码的优化。
- ATL-Style模板学习
- ATL---style模板
- ATL Style 模板学习手记
- ATL-Style模板 不用虚函数实现 多态
- ATL 模板
- ATL-Style类 (模板基类) 定义的一种AV错误
- ATL组件模板模拟
- ATL模板原理
- ATL中的CWindowImpl模板类
- ATL初学-2 :感悟ATL风格的模板
- WPF模板-Style中的Setter
- atl中常见的模板使用手法
- ATL布幔下的秘密之模板技术
- ATL实现的CDHtmlDialog模板类
- ATL/COM 活动模板库学习步骤
- ATL/COM 活动模板库学习步骤
- atl中常见的模板使用手法
- ATL/COM 活动模板库学习步骤
- Andorid Launcher程序代码分析
- Equinox OSGi服务器应用程序的配置步骤
- [杂记]折腾一中午,花30块钱,还没吃到饭。。
- s2sh整合的登陆
- Web应用中并发控制的实现
- ATL---style模板
- js省市区三级联动
- 从数据库中读取经纬度,在google map 上进行标注(一)
- 优化JVM参数提高eclipse运行速度及Java垃圾收集调优实战
- 去除maven compile 警告 [WARN] Using platform encoding (GB18030 actually)
- Matlab注释技巧
- C#操作sql server 数据库访问类
- 变态的SONY
- FreeTextBox