For this discussion, assume we have a COM object with three interfaces
The symmetric property states that if a call to
IA::QueryInterface(IID_IB, ...) is successful, a call to
IB::QueryInterface(IID_IA, ...) must be successful.
The reflexive property states that a call to
IA::QueryInterface(IID_IA, ...) must succeed.
The transitive property states that if a call to
IA::QueryInterface(IID_IB, ...) succeeds, and is followed by a call to
IB::QueryInterface(IID_IC, ...) that succeeds, than a call to
IA::QueryInterface(IID_IC, ...) must succeed.
These rules enforce the basic navigation principle: Given a pointer into an instance of a COM object, a client must be able to navigate to an instance of another interface implemented by the object.
Note that the COM specification does not state which interface pointer is to return in these calls. An object can choose to return pointers
to existing interfaces or create instances on demand. The only requirement constraining which interface pointer to return is for
As stated previously, because
IUnknown is used as an object's identity, all
QueryInterface calls into any interface within the object must return the same value for