問題タブ [virtual-inheritance]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
11 に答える
330640 参照

c++ - C++ では、仮想基底クラスとは何ですか?

「仮想基底クラス」とは何か、それが何を意味するのか知りたいです。

例を示しましょう:

0 投票する
5 に答える
2698 参照

c++ - C++ の複数の仮想継承と COM の比較

ネット上には「恐怖のダイヤモンド問題」の解説があふれています。スタックオーバーフローも同様です。私はそれを少し理解していると思いますが、その知識を、似ているが異なるものの理解に変換することに失敗しています.

私の質問は純粋な C++ の質問として始まりますが、答えは MS-COM の仕様に分岐する可能性があります。一般的な問題の質問は次のとおりです。

これは、従来のダイヤモンド ソリューションではありません。ここで「仮想」は正確に何をしますか?

私の本当の問題は、CodeProject の友人の場所での議論を理解しようとすることです。これには、Flash プレーヤー用の透明なコンテナーを作成するためのカスタム クラスが含まれます。

私はこの場所を楽しみにしようと思いました。次の宣言により、バージョン 10 の Flash Player でアプリがクラッシュすることが判明しました。

デバッグは、関数の実装 (QueryInterface など) に入るときに、さまざまな呼び出し元から、さまざまな呼び出しに対してさまざまな "this" ポインター値を取得することを示しています。しかし、「仮想」を削除するとうまくいきます。クラッシュはなく、同じ「this」ポインター。

何が起こっているのかを正確に理解したいと思います。どうもありがとう。

乾杯アダム

0 投票する
1 に答える
4120 参照

c# - オーバーライドされた仮想関数は呼び出されません

プロジェクトに奇妙な問題があります。基本クラスから継承し (これも別の基本クラスから継承します)、関数をオーバーライドするクラスがあります。ただし、その関数が呼び出されると、オーバーライドされた関数は呼び出されず、基本関数が呼び出されます。

ただし、中間クラスでその関数をオーバーライドすると、呼び出されます。しかし、これは紛らわしいです: 図面で説明しましょう :)

  • lib GuiShared

    • クラス bScreen
      • 仮想関数 InitializeRoc
  • lib TigerControlRoot

    • クラス bTigerScreen
      • override function InitializeRoc <-- ここでオーバーライドされると呼び出されます
  • lib TigerControlRootCommonScreens
    • クラス CheckInRules
      • オーバーライド関数 InitializeRoc <-- 呼び出されない :s

ただし、コンストラクターが呼び出されます...

これが私の(簡略化された)コードです:

共有基本クラス

プロジェクト基本クラス

失敗したクラス (またはそのライブラリの他のクラス)

さらに、基本クラスで何らかの関数を呼び出そうとすると、TypeLoadException が発生します。

同じ GuiShared ライブラリを使用した同様のコードが別のプロジェクトで使用されており、問題はありません。

0 投票する
4 に答える
1125 参照

c++ - 異なるコンパイラの C++ 仮想継承の実装は互換性がありませんか?

次のようなパブリック インターフェイスの階層があります。

IFooBar を実装するクラスは、ファクトリ関数と共に dll に配置されます。クライアント コードは dll をロードし、ファクトリ関数を使用してクラス インスタンスを作成し、それをインターフェイスに従って使用します (これらはヘッダー ファイルとして提供されます)。

Scheme は、MSVC によって作成された dll と、Borland C++ Builder 6 によって作成されたクライアント コードで正常に動作します。

仮想継承を階層に導入します。

そして、同じ状況 (MSVC による dll、Builder によるクライアント) で、クライアント コードがクラスのインスタンスを要求すると、乱雑な vtable でそれを取得します。

通常の継承にロールバックする以外に解決策はありますか?

0 投票する
2 に答える
454 参照

c++ - C++ での非対称仮想継承ダイヤモンド

だから私はこの考えを持っています.C ++で実装することは基本的に不可能だと思います...しかし、私は尋ねたい. Stroustrup の第 15 章を読みましたが、答えが得られませんでした。継承ダイヤモンドに関する他の 10 億の質問がこの質問に答えているとは思わないので、ここで質問します。

問題は、共通の基本クラス自体を共有する 2 つの基本クラスから継承するとどうなるかということですが、実質的には 2 つのうちの 1 つだけが継承されます。例えば:

私がこれをやりたいと思う理由は、ライブラリ全体を再コンパイルせずに既存のライブラリを拡張しようとしているからです (ワームの缶を開きたくない)。変更したい継承のチェーンが既に存在します。基本的にはこのようなものです(アスキーアートを許してください)

写真をゲット?各Myクラスのオブジェクトを、それら本質的に置き換えるクラスのオブジェクトにしたいのですが、継承図の次のクラスでは、My基本クラスからオーバーライドされたメソッド実装を使用する必要がありますが、他のすべてのメソッドはライブラリのクラス。ライブラリのクラスは事実上継承しないのでこんな感じ

しかし、クラスを事実上継承させると

MyDerivedvtableがあり、vtableがあるため、オブジェクトMyBaseは1つだけですか?LibBase

この質問が十分に明確であることを願っています。

0 投票する
4 に答える
10019 参照

c++ - 仮想関数と多重継承の場合のオブジェクト レイアウト

最近のインタビューで、仮想関数と多重継承を伴うオブジェクト レイアウトについて尋ねられました。
多重継承を伴わずに実装する方法 (つまり、コンパイラが仮想テーブルを生成する方法、各オブジェクトに仮想テーブルへの秘密のポインターを挿入する方法など) のコンテキストで説明しました。
私の説明には何かが欠けているように思えました。
ここに質問があります(以下の例を参照)

  1. クラス C のオブジェクトの正確なメモリ レイアウトを教えてください。
  2. クラス C の仮想テーブル エントリ。
  3. クラス A、B、および C のオブジェクトのサイズ (sizeof によって返される) (8、8、16 ??)
  4. 仮想継承を使用するとどうなりますか。確かに、サイズと仮想テーブルのエントリが影響を受けるはずですか?

コード例:

ありがとう!

0 投票する
7 に答える
18522 参照

c++ - C++の最終クラス

上記のコードは、継承できないクラス(final)を実現しようとします。しかし、上記のコードを使用すると、派生オブジェクトを作成できます。なぜですか?

目的の機能は、ctorがプライベートにされた場合にのみ達成されますが、私の質問は、dtorプライベートの場合にそれが達成できないのはなぜですか?

0 投票する
4 に答える
138 参照

c++ - 実装に見られない仮想メソッド

私は現在、後で実装される抽象インターフェイスを持つ C++ プロジェクトに取り組んでいます。インターフェースには、私の実装がオーバーライドしない実装されたメソッドもあります。私の問題は、実装を使用すると、コンパイラ (MSVC) がインターフェイス メソッドを認識しないことです。これは何が原因で、どうすれば解決できますか?

これがコードです。

0 投票する
2 に答える
935 参照

c++ - 仮想継承-gccとvc++

仮想継承に関してVisualStudio2008に問題があります。

次の例を考えてみましょう。

Linuxマシンでgccを使用すると、このコードは問題なくコンパイルされます。しかし、Visual Studioを使用してWindowsで同じものをビルドしようとすると、「エラーC2614:'B':不正なメンバーの初期化:'印刷'はベースまたはメンバーではありません」というエラーメッセージが表示されてコンパイルが失敗します。

なぜこれが機能しないのですか?

0 投票する
3 に答える
4456 参照

c++ - c++ 仮想継承

問題:

指定された位置で、gcc は Base() への関数呼び出し、つまりデフォルトのコンストラクターと一致しないと文句を言います。しかし、C は Base から直接継承せず、A と B を介してのみ継承します。では、なぜ gcc はここで文句を言うのでしょうか?

アイデア?ティア/ロブ