У меня есть класс с реализует 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.
};
EDIT : Я предполагаю, что проблема в том, что pluginA и pluginB находятся в разных общих библиотеках. Возможно, RTI не пересекает границы модуля. Я думаю, что это может иметь место, потому что примеры людей, кажется, работают хорошо в моих тестах. В частности, у плагина B нет «typeinfo для PluginA», если я использую «nm» на нем. Это может быть ядром проблемы. Если это так, мне просто придется обойти это либо виртуальным наследованием, либо виртуальной функцией cast_to_qobject()
в одном из моих интерфейсов.