ネット上には「恐怖のダイヤモンド問題」の解説があふれています。スタックオーバーフローも同様です。私はそれを少し理解していると思いますが、その知識を、似ているが異なるものの理解に変換することに失敗しています.
私の質問は純粋な C++ の質問として始まりますが、答えは MS-COM の仕様に分岐する可能性があります。一般的な問題の質問は次のとおりです。
class Base { /* pure virtual stuff */ };
class Der1 : Base /* Non-virtual! */ { /* pure virtual stuff */ };
class Der2 : Base /* Non-virtual! */ { /* pure virtual stuff */ };
class Join : virtual Der1, virtual Der2 { /* implementation stuff */ };
class Join2 : Join { /* more implementation stuff + overides */ };
これは、従来のダイヤモンド ソリューションではありません。ここで「仮想」は正確に何をしますか?
私の本当の問題は、CodeProject の友人の場所での議論を理解しようとすることです。これには、Flash プレーヤー用の透明なコンテナーを作成するためのカスタム クラスが含まれます。
私はこの場所を楽しみにしようと思いました。次の宣言により、バージョン 10 の Flash Player でアプリがクラッシュすることが判明しました。
class FlashContainerWnd: virtual public IOleClientSite,
virtual public IOleInPlaceSiteWindowless,
virtual public IOleInPlaceFrame,
virtual public IStorage
デバッグは、関数の実装 (QueryInterface など) に入るときに、さまざまな呼び出し元から、さまざまな呼び出しに対してさまざまな "this" ポインター値を取得することを示しています。しかし、「仮想」を削除するとうまくいきます。クラッシュはなく、同じ「this」ポインター。
何が起こっているのかを正確に理解したいと思います。どうもありがとう。
乾杯アダム