ATL派生类对应的模板基类定义如下:
/****************************************************************************
模板类CAtlInheritItf,继承了基接口IBaseItf方法的实现,
同时提供了IInheritItf的实现,可以将IInheritItf接口作为基接口共供其它接口继承
****************************************************************************/
template <class T, class Q, const IID* piid, const GUID* plibid = &CComModule::m_libid>
class ATL_NO_VTABLE CAtlInheritItf : public CAtlBaseItf<T, Q, piid, plibid>
{
public:
// 派生接口方法“InheritFunc”,在此模板类内实现
STDMETHOD(InheritFunc)()
{
m_pCPPObj->InheritFunc();
return S_OK;
}
};
更改IInheritItf接口的IDL定义:
[
object,
uuid(8F3902DF-DA55-4802-AB8A-958AFF45B2F4),
dual,
helpstring("IBaseItf Interface"),
pointer_default(unique)
]
// 基接口从ICPPObjSeeker派生
interface IBaseItf : ICPPObjSeeker
{
[id(1), helpstring("IBaseItf Method")] HRESULT BaseFunc();
};
[
object,
uuid(AFEBD472-4BEC-45CE-A5A2-E37537C4744A),
dual,
helpstring("IInheritItf Interface"),
pointer_default(unique)
]
// IInheritItf接口从IBaseItf接口派生
interface IInheritItf : IBaseItf
{
[id(11), helpstring("IInheritItf Method")] HRESULT InheritFunc();
};
最后,更改ATL派生类的模板基类:
class ATL_NO_VTABLE CATLInherit :
……,
public CAtlInheritItf<CInheritItfImplement, IInheritItf, &IID_IInheritItf, &LIBID_CPP2ATLLib>
{
……
};
现在,通过IInheritItf,我们可以使用IBaseItf的所有方法,实现了接口的继承。