【架构技术】模板类继承

在C++中,除了一般的指定基类名称的继承外,还有一种使用模版技术的继承,称之为模
版继承。请看如下代码,是偶从ATL的源代码中抽取出来的。


NOTE:   Class A 想要变成com组件,需要写一堆东西,有一事就是从IDispatch间接继承,IA::IDispatch。这是传统的想把类A变成一个属于别个类B体系的方法:类A继承类B

              模板类继承则提供了相反的方法,实现了组合方式,解耦。例如:类A想变成com组件体系中的IA,现在这样做: CComObject<A> IA; 我们使用IA即可,类A成了com组件的父类,不改变类A原有的类体系,实现了类A与com组件的组合

偶们不用管代码中的基类和派生类到底是干什么的,但这段向我们展示了一种可用的继
承技术。这种继承技术集成了C++的代码重用的优点(通过继承实现)和通用性的优点(通过
模版实现)

template <class Base>

class CComObject : public Base
{
public:
    typedef Base _BaseClass;
    CComObject(void* = NULL) throw()
    {
        _pAtlModule->Lock();
    }
    // Set refcount to -(LONG_MAX/2) to protect destruction and
    // also catch mismatched Release in debug builds
    virtual ~CComObject() throw()
    {
        m_dwRef = -(LONG_MAX/2);
        FinalRelease();
#ifdef _ATL_DEBUG_INTERFACES
        _AtlDebugInterfacesModule.DeleteNonAddRefThunk(_GetRawUnknown());
#endif
        _pAtlModule->Unlock();
    }
    //If InternalAddRef or InternalRelease is undefined then your class
    //doesn't derive from CComObjectRoot
    STDMETHOD_(ULONG, AddRef)() {return InternalAddRef();}
    STDMETHOD_(ULONG, Release)()
    {
        ULONG l = InternalRelease();
        if (l == 0)
            delete this;
        return l;
    }
    //if _InternalQueryInterface is undefined then you forgot BEGIN_COM_MAP
    STDMETHOD(QueryInterface)(REFIID iid, void ** ppvObject) throw()
    {return _InternalQueryInterface(iid, ppvObject);}
    template <class Q>
    HRESULT STDMETHODCALLTYPE QueryInterface(Q** pp) throw()
    {
        return QueryInterface(__uuidof(Q), (void**)pp);
    }

    static HRESULT WINAPI CreateInstance(CComObject<Base>** pp) throw();

};


class CAtlModule;
__declspec(selectany) CAtlModule* _pAtlModule = NULL;




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值