gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:59:18 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com