
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のインスタンスが作れていることすら疑問です。。。
よろしくお願いします。
No.3ベストアンサー
- 回答日時:
基本的なことは他の方が解答しているので可能性としてですが…
質問者さんのいうIUnknownインスタンスって、アロー演算子(->)を使ってるところからみて、IUnknown型ポインタですよね?
IUnknownクラスにCPlayer以外の派生クラスCHogeがあり、
そこでQueryInterfaceが定義されていたりして、
今回問題となっているIUnknown型ポインタにCHogeインスタンスのアドレスが代入されてたりすると
CPlayer::QueryInterfaceではなくCHoge::QueryInterfaceが呼ばれると思います。
そのため、CPlayer::QueryInterfaceを通らないのでは?
(私はIUnknownがなんなのかよく知りませんが、QueryInterfaceって名前からしてそんな使い方しててもおかしくないかな…と。)
なので、質問者の言うIUnknownインスタンスの実態がどこで宣言されているかを確認してみるといいのでは?と思います。

No.2
- 回答日時:
まず、確かに、純粋仮想関数を持つ、IUnknown クラスのインスタンスは生成できません。
ただし、IUnknown クラスへのポインタは宣言できます。
ですから、
IUnknown *ptr;
は、OKです。
(まだ実体がないから)
そして、クラスのポインタには、(クラスの参照にも)、そのクラスの派生クラスのインスタンスを指すポインタが代入できたり、初期化できたりします。
そのため、
IUnknown *ptr = new CPlayer();
は可能です。
もちろん、
IUnknown *ptr = new IUnknown();
はエラーになります。
このときに呼び出される、
ptr->QueryInterface();
は、ptr の実際のクラスである、CPlayer() で定義された QueryInterface を呼び出しますから、
確かに、CPlayer::QueryInterface() が呼び出されているはずです。
まずは、
ptr->QueryInterface();
の呼び出しポイントでブレークをかけてみて、そこから、トレースをしてみるのはいかがでしょうか?
No.1
- 回答日時:
ごめんなさい、質問が良く理解出来ていないのですが、簡単に言うと、派生先で実装されているヴァーチャルメソッドが、基底クラスのインスタンスコールで呼ばれるか?と言う質問で宜しいでしょうか?
もしそうなら、呼ばれません。
もし基底クラスのインスタンスが派生クラスのインスタンスをキャストしたものなら話は別ですが、そうで無い場合、基本的に基底クラスはどの様な派生クラスが有るのか感知しません。
例えばこう考えれば良いと思います。
もし、Aと言う基底クラスが有ったとして、そのAクラスが持つヴァーチャルメソッドの実装が、派生先のBクラスと、もう一つ全く別の同じくAを基底に持つCクラスと言う派生クラスが有った場合、Aクラスのインスタンスに対してヴァーチャルメソッドをコールした場合、Bに行くのかCに行くのか分からなくなってしまうでしょう?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
変数名の付け方
-
複数の変数を宣言する時、同時...
-
private static という変数の修飾
-
C# インスタンスの破棄
-
SQLを連続発行する時の正しい(?...
-
インスタンス参照でアクセスで...
-
newしないインスタンス?実体化...
-
VB.NET getとsetの概念がわかり...
-
C#「オブジェクト参照が必要で...
-
クラスのインスタンス名をクラ...
-
フォームの存在をチェックする方法
-
変数の参照でエラーが出てしま...
-
オブジェクト参照がオブジェク...
-
objective-cで分かりにくい所教...
-
javaのクラスの作り方、エラー...
-
フォームのCheck boxとOLEObjec...
-
VB6.0で、DLLを動的に参照したい
-
生成したインスタンスを削除す...
-
C#において、同じインスタンス...
-
別スレッド上の変数を参照する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
private static という変数の修飾
-
変数名の付け方
-
複数の変数を宣言する時、同時...
-
インスタンス参照でアクセスで...
-
生成したインスタンスを削除す...
-
オブジェクト参照がオブジェク...
-
C#において、同じインスタンス...
-
C# インスタンスの破棄
-
変数の参照でエラーが出てしま...
-
インスタンスを同じ名前で作成...
-
VB.NET getとsetの概念がわかり...
-
newしないインスタンス?実体化...
-
javaのクラスの作り方、エラー...
-
非staticフィールドを参照でき...
-
「インスタンス」の意味をわか...
-
[Visual C#] 優先される処理に...
-
フォームの存在をチェックする方法
-
大量のデータとインスタンスの...
-
C#「オブジェクト参照が必要で...
-
String a = "a"; と String b =...
おすすめ情報