WTL的几句代码看不懂
1 template <class T, class TBase = CWindow> class CDialogImpl;
2 template <class T, class TBase /* = CWindow */>
class ATL_NO_VTABLE CDialogImpl : public CDialogImplBaseT< TBase >
3 class CMainDlg : public CDialogImpl<CMainDlg>, public CUpdateUI<CMainDlg>,public CMessageFilter, public CIdleHandler
问题:
经过上面3句代码,就可以在CMainDlg类中直接使用CWindow类里的public成员了,我照着写了一个一样的例子却不行,为什么啊,还是我有看漏的地方
[解决办法]
直接class CMainDlg : public CDialogImpl<CMainDlg> 就可以了。
[解决办法]
建议你看看 模版和继承
[解决办法]
CWindow->CWindowImplRoot->CDialogImplBaseT->CDialogImpl
根据以上继承关系说明,继承CDialogImpl是可以达到你的目的的,这与WTL的其他细节无关。
WTL中使用编译器的模板多态来完成函数的重写,同时完成消息处理的接口分发。
你看下atlapp.h这个文件就全明白了。
CIdleHandler是个供你实现的接口
- C/C++ code
class CIdleHandler{public: virtual BOOL OnIdle() = 0;};
[解决办法]
给你解释下
1 template <class T, class TBase = CWindow> class CDialogImpl;
实例化TBase = CWindow
2 template <class T, class TBase /* = CWindow */>
class ATL_NO_VTABLE CDialogImpl : public CDialogImplBaseT< TBase >
这个是模版定义
3 class CMainDlg : public CDialogImpl<CMainDlg>
继承CDialogImpl,并实例化class T, 得到最终的实例化CMainDlg