gpt4 book ai didi

c++ - 带接口(interface)的动态转换

转载 作者:可可西里 更新时间:2023-11-01 18:09:57 24 4
gpt4 key购买 nike

我有一个类实现了 2 个接口(interface)并继承了 1 个类。所以,通常它看起来像这样:

class T : public A, public IB, public IC {
};

代码中有一处我有 IB *,但实际上可以使用 A *。我希望动态 Actor 会喜欢这样:

IB *b_ptr = new T; // it's really more complicated, but serves the example
A *a_ptr = dynamic_cast<A *>(b_ptr);

不幸的是,这不起作用。有没有正确的方法来做到这一点?还是我应该实现变通办法?我考虑过让 IBIC 都从 A 虚拟继承,但是 IIRC 上次我尝试了一些复杂的事情不受欢迎。

有什么想法吗?

编辑:哦,是的,这是插件 API 的一部分,所以很遗憾,我无法直接访问需要 T 类型一个 *。我的示例然后彼此相邻,但如前所述,它更复杂。基本上我有 2 个共享库。 TT1(我有一个 IB *)都是实现插件 API 并且在共享库内部的类。

澄清一下:这是我的典型插件的更具体示例(它们在单独的库中):

插件A:

class PluginA : public QObject, public PluginInterface, public OtherInterface {
};

插件 B:

class PluginB : public QObject, public PluginInterface {
// in here, I have a PluginInterface *, but really could use a QObject *
// unfortunately, PluginB has absolutely no knowledge of the "PluginA" type
// it just so happens that my PluginInterface * pointer points to an object of type
// PluginA.
};

编辑:我猜测问题是 pluginA 和 pluginB 在不同的共享库中。也许 rtti 不会跨越模块边界。我认为可能是这种情况,因为人们的示例在我的测试中似乎运行良好。具体来说,如果我对它执行“nm”操作,pluginB 就没有“PluginA 的类型信息”。这可能是问题的核心。如果是这种情况,我只需通过虚拟继承或我的接口(interface)之一中的虚拟 cast_to_qobject() 函数来解决它。

最佳答案

是否每个类至少有一个虚方法?如果没有,那就是你的问题。为每个类添加一个虚拟析构函数应该可以解决这个问题。

以下内容很适合我:

class IC
{
public:
virtual ~IC() {}
};

class IB
{
public:
virtual ~IB() {}
};

class A
{
public:
virtual ~A() {}
void foo() { /* stick a breakpoint here to confirm that this is called */ }
};

class T : public A, public IB, public IC
{
public:
virtual ~T() {}
};


int main(void)
{
IB *b_ptr = new T;
A *a_ptr = dynamic_cast<A *>(b_ptr);
a_ptr->foo();
return 0;
}

编辑:

在所有新信息和异常行为(您的代码应该正常工作!)之后,以下是否有帮助?我引入了一个名为 IObject 的接口(interface),并使用虚拟继承来确保这个基类只有一个拷贝。您现在可以转换为 IObject,然后转换为 A 吗?

class IObject
{
public:
virtual ~IObject() {}
};

class IC : virtual public IObject
{
public:
virtual ~IC() {}
};

class IB : virtual public IObject
{
public:
virtual ~IB() {}
};

class A : virtual public IObject
{
public:
virtual ~A() {}
void foo() { /* stick a breakpoint here to confirm that this is called */ }
};

class T : virtual public A, virtual public IB, virtual public IC
{
public:
virtual ~T() {}
};


int main()
{
IB *b_ptr = new T;
A *a_ptr = dynamic_cast<A *>( dynamic_cast<IObject *>(b_ptr) );
a_ptr->foo();
return 0;
}

我并不是说这是正确的解决方案,但它可能会提供一些关于正在发生的事情的信息......

关于c++ - 带接口(interface)的动态转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/441983/

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