IUnknown::QueryInterface()
的典型实现方式如下:为每个支持的接口(interface) ID 使用一个 if-else-if
链并执行以下操作:
if( iid == __uuidof( IInterfaceN ) ) {
*ppv = static_cast<IInterfaceN>( this );
//call Addref(), return S_OK
}
现在 static_cast
is necessary此处用于在多继承场景中适当调整指针。
我偶尔会看到使用 dynamic_cast
的实现。 IMO 这是在浪费时间 - 结果是一样的,只是需要更长的时间并使实现过度设计。
在将指针复制到 的
实现?void**
参数之前,是否确实需要使用 dynamic_cast
来转换 this
指针IUnknown::QueryInterface()
最佳答案
在那些“支持的接口(interface) ID”未知的 QueryInterface
实现中,这是必要的。例如。如果您决定在基类中实现 QueryInterface
,而不是为每个派生类覆盖它。
发生这种情况的情况是您有很多相似的类型,其中“相似”意味着“实现许多相同的接口(interface)”。 IE。你有对象类型 Derived1
... DerivedN
它们都实现了 Interface1
...InterfaceM
的一些子集。
这可能是游戏引擎的情况,其中游戏实体都实现了 IMoveable
、IScriptable
、IFactory
、 的子集IShoots
、IPlayerControlled
、IStealthy
、ISensor
等。当然,根据 COM 规则,您必须能够调用 IFactory::QueryInterface
并获得 IMovable*
当且仅当工厂也实现了 IMovable
。
您将如何实现所有这些 QueryInterface
方法?最简单的方法是在IUnknown
和IFactory
之间插入一个GameObject
基类,然后使用实现
检查。这样,您只需要一个实现,而不是每个具体类型的接口(interface)一个。GameObject::QueryInterface
>dynamic_cast
关于c++ - 在 QueryInterface 实现中是否应该使用 dynamic_cast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4884391/