« IDLの記述 | メイン | IRendererBufferAcces関連仕様 »

2004年08月31日

吉里吉里2/KAG3ムービー拡張日誌:: 多重継承

    

COMの場合、1つのクラスに複数のインターフェイスを持たせるのが一般的なようだが、そのためには多重継承をしなければならない。
しかし、すべてのインターフェイスはIUnknownを継承する。
つまり、QueryInterfaceやAddRedなどのメソッドがかぶってしまう。
おいおいどうするんだ?それってやばくないのか?と思っていたが、実は全然問題ないようだ。
そもそもCOMもそれを期待している節があるようだ。

多重継承を行った場合、基底クラスごとに仮想関数テーブルが作られる。
そして、共通の関数は両方のテーブルで同じ物を指す。
つまり、何の問題もないのだ。
ただし、複数の仮想関数テーブルが作られる関係上、キャストは慎重に行わなければいけない。
QueryInterfaceで返すインターフェイスは、要求された型に一度きちんとキャストする必要がある。
そうしなければ、仮想関数テーブルが別物になってしまい、うまく動作しなくなる。
また、仮想関数テーブルが違うと言うことは、ポインタが異なる。
つまり、同じクラスが持っているインターフェイスでも、QueryInterfaceで返ってきたインターフェイス同士を比較してはいけない。
まあ、利用者側としては、同じクラスかどうかなどわからないし、それを期待した実装はしてはいけないので、さして問題はない。
どうしても、比較したい場合は、そのインターフェイスにQueryInterfaceでIUnknownを要求し、そのIUnknownインターフェイスのポインタを比較するようにしないといけないようだ。と言っても、使わないけどね。

ここの説明は、C++がどのようにクラスを実現しているか、メモリ構造がどうなっているかを知っていないとかなりわからないかも。
まあ、C++のクラスのメモリ構造を知ってて、多重継承はどうなの?って説明だからなんだけど。
それと、図があった方がもっとわかりやすいっすね。
自分用の備忘録としてはこれで十分なんだけど。



投稿者 Takenori : 2004年08月31日 10:46




comments powered by Disqus
Total : Today : Yesterday : なかのひと