【问题标题】:how to query up or query down the interface pointer?如何向上查询或向下查询接口指针?
【发布时间】:2014-10-09 17:32:07
【问题描述】:

我需要在我的程序中向上查询和向下查询接口指针,

我已经定义了接口

struct Iinterface1
{
    methods X1()
}

struct Iinterface2 : Iinterface1
{

     methods X2()
}

queryInterface( *interface)
{
  returns the pointer to one of above interface
}

我可以使用函数queryInterface()查询并获取指向接口的指针

由于interface2后来出现,我的程序需要同时支持method1和method2,所以我不能有interface指针指向interface2并执行方法x1和方法x2。 我正在寻找的是如何在执行期间升级或更改接口指针。 所以我会查询并获取指向 interface1 的指针并执行方法 x1,然后当我想执行方法 x2 时,我需要查询指向 interface2 的指针,以便我可以执行方法 x2。说得通? 感谢您对示例的任何帮助。

【问题讨论】:

  • 这看起来不太像 COM 接口,如果您发布您的实际代码会有所帮助

标签: c++ pointers interface com


【解决方案1】:

假设Interface1有一个虚方法,那么如果你有一个指向Iinterface1的指针,你可以测试它是否是一个动态转换的Iinterface2

const Iinterface2 * is_Iinterface2 (const Iinterface1 *p) {
    return dynamic_cast<const Iinterface2 *>(p);
}

如果结果是NULL,则p 不是来自派生自Interface2 的对象。

C++ 没有办法动态查询来确定一个类是否有特定的方法。

【讨论】:

  • 如果base有虚函数。
  • 感谢@jxh 和 Neil,嗯,我不确定这是否适用于我的部分代码,需要修改很多部分,我是 COM 新手,我只看到天空中的星星: (
  • 你必须自己实现 COM(或者找一个库来为你做)。没有直接的 C++ 支持以 COM 指定的方式查询接口。
  • 在 COM 中,接口指针上的 dynamic_cast 实际上调用 QueryInterface 并导致指针为 AddRef'd。 (COM 旨在成为 C++ 对象模型的与语言无关的泛化)。我想是使用dynamic_cast 还是显式调用QueryInterface 更清晰,这是一个见仁见智的问题。注意——这就是在 C++Builder 中发生的事情;阅读other comments 表明,当您 dynamic_cast 一个 COM 接口指针时,MSVC 可能会导致 UB。
猜你喜欢
  • 2018-05-30
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 2013-07-23
  • 2011-09-27
  • 2023-01-28
相关资源
最近更新 更多