私はC++は仮想関数では無く、純粋仮想関数を使ってインターフェイスを定義していると理解しているのですが、、、> ユーザーの皆様、COMの取り扱い方についてちょっとご相談。
> AB4では、C++のそれと同じように、仮想関数を定義することでCOMインターフェイスを定義しています。しかし、実体を持つクラス(ここでは、メンバ変数を持つという意味)を多重継承できないなど、ちょっとした制約があることも事実です。
ActiveBasicも純粋仮想関数を導入してはどうですか?
C++のインターフェイスで関数の後に=0がついているのが純粋仮想関数
コード: 全て選択
virtual HRESULT Hoge(DWORD dw) = 0;
仮想関数か純粋仮想関数かになります。
山本様もご承知の通り、この二つは別物です。
※もしかして、
ABの仮想関数がC++でいうところの純粋仮想関数なのでしょうか?
OLEドロップの細かい挙動がおかしくなるのもこの影響なんですね?> また、仮想関数とインターフェイスメソッドの違いなども問題になっています。コンパイラが生成する仮想関数は、オブジェクトのThisポインタがecxレジスタを介して渡されますが、インターフェイスメソッドへのインターフェイスポインタの引き渡しはスタックを介して行われます。細かい部分ですが、コーディング作法にも影響してくるところなので、ちょっと気になる点です。
まぁ、詳しくは分からないので何とも言えませんが。。。
Interfaceステートメントは、複数のインターフェイスの実装を可能にするつもりです。
>
> あと、Classステートメントで定義される仮想関数のフリをしたインターフェイスについてですが、Interfaceステートメントを導入したら、廃止しようと思います。まぁ、クラスの仮想関数がインターフェイスとして使えなくかもしれないってことです。
>
> 何かご意見、アドバイスなどありましたらご返信願います。
いろいろオブジェクト指向の周りを整備していこうとしているのであれば
追加すべき事柄がたくさんありますよ。
たとえば、現状ではインターフェイスIDをユーザが構造体変数として自力で
定義しないといけなくなっています。
ですのでCでいうところのexturnなんぞを導入して
GUID型の特定の名前の変数を定義したら自動的に初期化してくれるような
機能が必要ですし、
今のようにずらずらとClass~End Class間にメンバ関数を定義していく状態だとかなり大変なことになりますよね。
これらはポリモーフィズム以前の問題です。
あとはブログにもあったようにvtableの上書きですね。
とにかく、問題が山積みだと思いますので
頑張ってください。
P.S.
他にも欲しい機能がありました。
・クラス内にスタティックメンバを入れられるとか
・フレンドクラスとか
・関数のオーバーロード←絶対必要
これじゃきり無いな。。。