Topic: Inheritance from the basic interface public IDispatch

Prompt how correctly to make interfaces IBase, please: IDispatch [id (1)] HRESULT AddObject ([in] IBase *pObject); IDerived1: IBase IDerived2: IBase IDerived3: IBase... Much the such Made by means of ClassWizard CBase, altered in a template File Base.h template <class CT, class T, const IID* piid = &__uuidof (T), const GUID* plibid = &CAtlModule::m_libid, WORD wMajor = 1, WORD wMinor = 0, class tihclass = CComTypeInfoHolder> class CBase: public IDispatchImpl <T, piid, plibid, wMajor, wMinor, tihclass> File Derived1.h class ATL_NO_VTABLE CDerived1: public CComObjectRootEx <CComSingleThreadModel>, public CComCoClass <CDerived1, &CLSID_NULL>, public IConnectionPointContainerImpl <CDerived1>, public CProxy_IBaseEvents <CDerived1>, public CBase <CDerived1, IDerived1, &IID_IDerived1, &LIBID_TestLib,/*wMajor = */1,/*wMinor = */0> {public: CDerived1 () {} BEGIN_COM_MAP (CDerived1) COM_INTERFACE_ENTRY (IDerived1) COM_INTERFACE_ENTRY (IBase) COM_INTERFACE_ENTRY (IDispatch) COM_INTERFACE_ENTRY (IConnectionPointContainer) END_COM_MAP () Further the notification on event: File Base.h STDMETHODIMP AddObject (IBase * pObject) {(static_cast <CT *> (this))-> Fire_OnAddObject (pObject); return S_OK;} It is normal? Or it is possible to make easier and more beautifully somehow?