2 つのインターフェイスを実装し、1 つのクラスを継承するクラスがあります。したがって、一般的には次のようになります。
class T : public A, public IB, public IC {
};
コードには がありますが、IB *
実際には を使用できるポイントが 1 つあり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 の typeinfo」がありません。これが問題の核心かもしれません。この場合は、仮想継承またはcast_to_qobject()
インターフェイスの 1 つで仮想関数を使用して回避する必要があります。