实现接口继承的实质是为派生ATL类添加基接口,而为一个ATL类添加接口的实质则是:
l 修改IDL文件,体现接口的继承关系
l 在ATL类中提供接口实现
修改IDL文件很简单,只需要更改派生接口的基接口即可。在ATL类中添加基接口的实现倒颇费思量,我们的做法是:
l 扩展ATL模板基类的意义,每一个ATL组件类都对应一个模板基类,都从该模板基类派生
l 派生类的模板基类,从基类的模板基类中派生;CCPP2ATLTemplateBase是模板派生树的根节点,所有的模板都派生自CCPP2ATLTemplateBase
l 所有的接口方法,都在对应的模板基类中实现
ATL派生类继承自它对应的模板基类,这个模板基类又继承自ATL基类对应的模板基类,而在ATL基类的模板基类中提供了基接口的实现。所以,ATL派生类最终继承了基接口的实现。C++类、ATL类、各模板基类的继承关系如下图所示:
假定IBaseItf是基接口,IInheritItf是派生接口。ATL基类对应的模板基类定义如下:
/****************************************************************************
模板类CAtlBaseItf,提供了IBaseItf的实现,
用于将IBaseItf接口作为基接口共供其它接口继承
****************************************************************************/
template <class T, class Q, const IID* piid, const GUID* plibid = &CComModule::m_libid>
class ATL_NO_VTABLE CAtlBaseItf : public CCPP2ATLTemplateBase<T, Q, piid, plibid>
{
public:
// 基接口方法“BaseFunc”,在此模板类内实现
STDMETHOD(BaseFunc)()
{
m_pCPPObj->BaseFunc();
return S_OK;
}
};