万星星@豌豆荚 欢迎加入我们
一个吃软饭的男人!!!!!我只想写程序####
微博:http://weibo.com/wanlianwen
posts - 172,  comments - 1253,  trackbacks - 0
学习WTL时,发现其窗口实现模式采用ATL窗口实现方式,于是对ATL窗口实现机制研究一下。
其主要思想还是继承和模板,避免需函数导致运行时类结构增大。利用控制台程序模拟如下:
#include <iostream>
template<class T>
class A
{
public:
 A()
 {
 }
 virtual ~A()
 {
 }
 void Say()
 {
  (static_cast<T*>(this))->Say();
 }
};
class DeriveA : public A<DeriveA>
{
public:
 DeriveA() : A<DeriveA>()
 {
 }
 void Say()
 {
  std::cout << "Hello, World!" << std::endl;
 }
};
int main(int argc, char* argv[])
{
 A<DeriveA>*  pA = new DeriveA();
 pA->Say();
delete pA;
 return 0;
}
主要通过基类的this指针识别对象。
posted on 2005-12-20 16:32 万连文 阅读(1167) 评论(5)  编辑 收藏 引用 所属分类: ATL

FeedBack:
# re: ATL窗口继承实现机制
2005-12-20 21:55 | 力为
(static_cast<T*>(this))->Say();
这句去掉,不可以么?  回复  更多评论
  
# re: ATL窗口继承实现机制
2005-12-21 09:32 | 小明
(static_cast<T*>(this))->Say(); 这句话的意思是调用派生类的say函数

这个例子比较失败
也许main要这样写才体现效果

int main(int argc, char* argv[])
{
A<DeriveA> *a = new DeriveA();
a->Say();
delete a;
return 0;
}
  回复  更多评论
  
# re: ATL窗口继承实现机制
2005-12-29 20:02 | 力为
原来这句是用来实现虚函数的功能。
void Say()
{
(static_cast<T*>(this))->Say();
}

恍然大悟,呵呵  回复  更多评论
  
# re: ATL窗口继承实现机制
2006-01-12 00:05 | benny
其实这个技巧即是atl internal里介绍的模拟动态绑定,也叫做mix-in类。好久没有看过wtl了,出来工作后都变懒了。交个朋友 :)
qq-87901181  回复  更多评论
  
# re: ATL窗口继承实现机制
2006-01-13 17:19 | 万连文
是呀,感觉很奥妙。有些东西,自己想都不敢想,别人玩起来就可以化腐朽为神奇,所以我们还是思维深度和胆识不够!  回复  更多评论
  

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


简历下载
联系我

<2005年12月>
27282930123
45678910
11121314151617
18192021222324
25262728293031
1234567

常用链接

留言簿(66)

随笔分类

随笔档案

相册

搜索

  •  

最新评论

阅读排行榜

评论排行榜