c++ - 在 QueryInterface 实现中是否应该使用 dynamic_cast?

标签 c++ com casting multiple-inheritance

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 的一些子集。

这可能是游戏引擎的情况,其中游戏实体都实现了 IMoveableIScriptableIFactory 的子集IShootsIPlayerControlledIStealthyISensor 等。当然,根据 COM 规则,您必须能够调用 IFactory::QueryInterface 并获得 IMovable* 当且仅当工厂也实现了 IMovable

您将如何实现所有这些 QueryInterface 方法?最简单的方法是在IUnknownIFactory之间插入一个GameObject基类,然后使用实现GameObject::QueryInterface >dynamic_cast 检查。这样,您只需要一个实现,而不是每个具体类型的接口(interface)一个。

关于c++ - 在 QueryInterface 实现中是否应该使用 dynamic_cast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4884391/

相关文章:

java - 为什么JDK Map.get不支持返回值的类型推断

swift - 将 PFObject 指针转换为解析中的子类(swift)

c++ - 为什么我不能将我的 QDialog 设置为没有 sizeGrip?

c++ - 'GetProcessIdOfThread' : identifier not found

c++ - std::map::find 的效率与值的数据大小有关吗?

c++ - ATLComTime.h 是可再发行组件的一部分?

com - RegSvr 和 RegServer 有什么区别?

c++ - 使用快速排序排序不会给出排序数组

c# - 将 HRESULT 转换为可读消息

C 和类型转换 - 为什么这个程序在 6 处停止?