Это было бы необходимо в тех реализациях QueryInterface
, где "идентификаторы поддерживаемых интерфейсов" неизвестны. Например. если вы решили реализовать QueryInterface
в базовом классе, а не переопределять его для каждого производного класса.
Случай, когда это может произойти, - это ситуация, когда у вас есть много схожих типов, где «схожие» означают «реализацию множества одинаковых интерфейсов». То есть у вас есть типы объектов Derived1
... DerivedN
, которые реализуют некоторое подмножество Interface1
... InterfaceM
.
Это может иметь место для игрового движка, где все игровые сущности реализуют подмножество IMoveable
, IScriptable
, IFactory
, IShoots
, IPlayerControlled
, IStealthy
, ISensor
и так далее. Конечно, по правилам COM вы должны быть в состоянии вызвать IFactory::QueryInterface
и получить IMovable*
тогда и только тогда, когда фабрика также реализует IMovable
.
Как вы собираетесь реализовать все эти QueryInterface
методы? Проще всего вставить базовый класс GameObject
между IUnknown
и IFactory
и реализовать GameObject::QueryInterface
с использованием проверок dynamic_cast
. Таким образом, вам нужна только одна реализация вместо одной на интерфейс конкретного типа.