It's because of the IUnknown's AddRef, Release and QueryInterface implementation. You have to achieve, that the IUnknown implementation is one for the whole object, regardless of how many interfaces it consists of (there's usually only one reference counter for the whole object). This means that you need the implementation to be placed in the last object in the hierarchy. Therefore the CComObject is a neat trick, how to save user the need to write the AddRef/Release code into every user class.