我有一个实现 2 个接口并继承 1 个类的类。所以,通常它看起来像这样:
class T : public A, public IB, public IC {
};
代码中有一点我有一个IB *
,但实际上可以使用一个A *
. 我希望动态演员是这样的:
IB *b_ptr = new T; // it's really more complicated, but serves the example
A *a_ptr = dynamic_cast<A *>(b_ptr);
不幸的是,这不起作用。有没有合适的方法来做到这一点?还是我应该实施解决方法?我曾考虑过同时拥有IB
并IC
从虚拟继承A
,但上次我尝试 IIRC 时,有一些并发症使其不受欢迎。
有什么想法吗?
编辑:哦,是的,这是插件 API 的一部分,所以不幸的是我无法直接访问T
我需要的类型A *
。我的示例彼此相邻,但如前所述,它更复杂。基本上我有 2 个共享库。T
和T1
(我有一个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 的类型信息”。这可能是问题的核心。如果是这种情况,我只需通过虚拟继承或cast_to_qobject()
我的一个接口中的虚拟函数来解决它。