class CMyClass: public FUnknown { public: CMyClass (); virtual ~CMyClass (); DECLARE_FUNKNOWN_METHODS // declares queryInterface, addRef and release }; CMyClass::CMyClass () { FUNKNOWN_CTOR // init reference counter, increment global object counter } CMyClass::~CMyClass () { FUNKNOWN_DTOR // decrement global object counter } IMPLEMENT_REFCOUNT (CMyClass) // implements reference counting tresult CMyClass::queryInterface (const char* iid, void** obj) { QUERY_INTERFACE (iid, obj, ::FUnknown::iid, CMyClass) return kNoInterface; }
Developing a class with more than one interface is done by multiple inheritance. Additionally you have to provide an appropriate cast for each interface in the queryInterface method.
class CMyMultiClass: public IPluginBase, public IPlugController, public IEditorFactory { public: DECLARE_FUNKNOWN_METHODS // declare the methods of all inherited interfaces here... }; tresult CMyMultiClass::queryInterface (const char* iid, void** obj) { QUERY_INTERFACE (iid, obj, ::FUnknown::iid, IPluginBase) QUERY_INTERFACE (iid, obj, IPluginBase::iid, IPluginBase) QUERY_INTERFACE (iid, obj, IPlugController::iid, IPlugController) QUERY_INTERFACE (iid, obj, IEditorFactory::iid, IEditorFactory) *obj = 0; return kNoInterface; }