重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

C++について
COMとMediaFoundationについて勉強中ですが、継承とオーバーライド
の部分で混乱してしまったので、アドバイスをお願いします。

IUnknownクラスは、三つの純粋仮想関数を持っていて、
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject)=0;
virtual ULONG STDMETHODCALLTYPE AddRef(void)=0;
virtual ULONG STDMETHODCALLTYPE Release(void)=0;
の三つがあることがわかりました。

そのIUnknownクラスを継承したIMFAsyncCallback、
IMFAsyncCallbackをさらに継承したCPlayerクラスがあります。

CPlayerクラスの中でCPlayer::QueryInterfaceの定義・処理が記述されています。
ここで、ほかのCPlayerクラスの関数内で
IUnknownのインスタンス->QueryInterface(引数) ;
で呼び出された場合、
CPlayer::QueryInterfaceには飛ばないのでしょうか?
何度ブレークポイントを張ってもきていないので、
いったいどこで処理が行われているか不思議で仕方ないです。

というかIUnknownのインスタンスが作れていることすら疑問です。。。
よろしくお願いします。

A 回答 (3件)

基本的なことは他の方が解答しているので可能性としてですが…




質問者さんのいうIUnknownインスタンスって、アロー演算子(->)を使ってるところからみて、IUnknown型ポインタですよね?

IUnknownクラスにCPlayer以外の派生クラスCHogeがあり、
そこでQueryInterfaceが定義されていたりして、

今回問題となっているIUnknown型ポインタにCHogeインスタンスのアドレスが代入されてたりすると

CPlayer::QueryInterfaceではなくCHoge::QueryInterfaceが呼ばれると思います。
そのため、CPlayer::QueryInterfaceを通らないのでは?

(私はIUnknownがなんなのかよく知りませんが、QueryInterfaceって名前からしてそんな使い方しててもおかしくないかな…と。)

なので、質問者の言うIUnknownインスタンスの実態がどこで宣言されているかを確認してみるといいのでは?と思います。
    • good
    • 0

まず、確かに、純粋仮想関数を持つ、IUnknown クラスのインスタンスは生成できません。


ただし、IUnknown クラスへのポインタは宣言できます。

ですから、
IUnknown *ptr;
は、OKです。
(まだ実体がないから)

そして、クラスのポインタには、(クラスの参照にも)、そのクラスの派生クラスのインスタンスを指すポインタが代入できたり、初期化できたりします。
そのため、
IUnknown *ptr = new CPlayer();
は可能です。

もちろん、
IUnknown *ptr = new IUnknown();
はエラーになります。

このときに呼び出される、
ptr->QueryInterface();
は、ptr の実際のクラスである、CPlayer() で定義された QueryInterface を呼び出しますから、
確かに、CPlayer::QueryInterface() が呼び出されているはずです。

まずは、
ptr->QueryInterface();
の呼び出しポイントでブレークをかけてみて、そこから、トレースをしてみるのはいかがでしょうか?
    • good
    • 0

ごめんなさい、質問が良く理解出来ていないのですが、簡単に言うと、派生先で実装されているヴァーチャルメソッドが、基底クラスのインスタンスコールで呼ばれるか?と言う質問で宜しいでしょうか?



もしそうなら、呼ばれません。
もし基底クラスのインスタンスが派生クラスのインスタンスをキャストしたものなら話は別ですが、そうで無い場合、基本的に基底クラスはどの様な派生クラスが有るのか感知しません。

例えばこう考えれば良いと思います。

もし、Aと言う基底クラスが有ったとして、そのAクラスが持つヴァーチャルメソッドの実装が、派生先のBクラスと、もう一つ全く別の同じくAを基底に持つCクラスと言う派生クラスが有った場合、Aクラスのインスタンスに対してヴァーチャルメソッドをコールした場合、Bに行くのかCに行くのか分からなくなってしまうでしょう?
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!