WEB开发网
开发学院软件开发VC MFC程序员的WTL指南(2)ATL 界面类 阅读

MFC程序员的WTL指南(2)ATL 界面类

 2006-07-22 22:03:51 来源:WEB开发网   
核心提示: WTL现在已经是第二次修正了,最初的版本是3.1,MFC程序员的WTL指南(2)ATL 界面类(4),现在的版本是7(WTL的版本号之所以这样选择是为了与ATL的版本匹配,所以不存在1和2这样的版本号),因为模板代码是在编译其间生成的,所以只要编译器生成正确的继承列表,WTL 3.1可以与

WTL现在已经是第二次修正了,最初的版本是3.1,现在的版本是7(WTL的版本号之所以这样选择是为了与ATL的版本匹配,所以不存在1和2这样的版本号)。WTL 3.1可以与VC 6和VC 7一起使用,但是在VC 7下需要定义几个预处理标号。WTL 7向下兼容WTL 3.1,并且不作任何修改就可以与VC 7一起使用,现在看来没有任何理由还使用3.1来进行新的开发工作。

ATL-style 模板

即使你能够毫不费力地阅读C++的模板类代码,仍然有两件事可能会使你有些头晕,以下面这个类的定义为例:

class CMyWnd : public CWindowImpl<CMyWnd>
{
  ...
}; 

这样作是合法的,因为C++的语法解释说即使CMyWnd类只是被部分定义,类名CMyWnd已经被列入递归继承列表,是可以使用的。将类名作为模板类的参数是因为ATL要做另一件诡秘的事情,那就是编译期间的虚函数调用机制。

如果你想要了解它是如何工作地,请看下面的例子:

template <class T>
class B1
{
public:
  void SayHi()
  {
    T* pT = static_cast<T*>(this);  // HUH?? 我将在下面解释
    pT->PrintClassName();
  }
protected:
  void PrintClassName() { cout << "This is B1"; }
};
class D1 : public B1<D1>
{
  // No overridden functions at all
};
class D2 : public B1<D2>
{
protected:
  void PrintClassName() { cout << "This is D2"; }
};
main()
{
  D1 d1;
  D2 d2;
  d1.SayHi();  // prints "This is B1"
  d2.SayHi();  // prints "This is D2"
}

这句代码static_cast<T*>(this) 就是窍门所在。它根据函数调用时的特殊处理将指向B1类型的指针this指派为D1或D2类型的指针,因为模板代码是在编译其间生成的,所以只要编译器生成正确的继承列表,这样指派就是安全的。(如果你写成:

上一页  1 2 3 4 5 6 7 8 9  下一页

Tags:MFC 程序员 WTL

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接