問題タブ [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 投票する
1 に答える
186 参照

c++ - 基本クラスからの仮想継承

AFAIK、仮想継承は菱形継承問題を解決しますが、仮想を使用して基本クラスから単純に継承するとどうなりますか?virtualここで使用することとの違いは何ですか?

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

c++ - Multiple instances of a virtual base class subobject (really) -- no way?

Given the code:

can we make the second assert fail?

In other words, this is the case when we have a two-diamond inheritance graph and would like to have separate subobjects for both diamonds' tops in the most derived object.

The standard (2003, 10.1.4) wording seems to prohibit this, and if really so, the follow-up question is: are we given no means of precise virtual-over-multiply-included subobject structure manipulation, and why?

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

c++ - 基本クラスの仮想継承と空のvtable

このコードがあります:

一部のクラスが仮想的に継承されると、Derivedクラスの空のvtableが作成されることを読みました。したがって、メモリレイアウトは次のようになります。

そしてそれは12バイトです。問題は、仮想メソッドがない場合、この空のvtableの目的は何であり、どのように使用されるのかということです。

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

c++ - gcc 4.5.1 仮想継承の問題

コードスニペットから始めましょう:

GCC 4.5.1 および 4.6.1 でコンパイルされた Derived クラスのコンストラクター間の唯一の違いは、最初のコンストラクターが、どの Base1 コンストラクターを呼び出す必要があるかを明示的に示していることです。main() の両方の cout が 8 を出力することを期待します。残念ながら、最初のものは 0! を出力します。

なんで?

Base1 コンストラクターの明示的な定義を有効にすると、問題が修正されます。Derived クラス定義 (クラス Derived: public A1、public A2) で仮想継承を削除すると、同様に機能します。期待される動作ですか?

この問題は、GCC 3.4.4 または Microsoft コンパイラ (VS) では観察できません。

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

python - Django モデルで仮想継承をシミュレートする適切な方法はありますか?

ユーザーが行ったアクションをログに記録したい。ほとんどの OO 言語では、や などLoggedActionのいくつかの子クラスを持つクラスを介してこれを実装します。その後、 のリストを反復処理し、 仮想継承を通じて特定の子の動作を取得できます。ただし、これは Django モデルでは機能しません。LoginActionLogoutActionLoggedAction

models.py

[unicode(l) for l in LoggedAction.objects.all()]次に、次のようなメッセージのリストを取得したいと思いますu'2012-02-18 18:47:09.105840: knatten logged in'

期待どおり、これは機能しません。取得するのは、メンバーまたはメンバーのいずれかを持つオブジェクトall()のリストだからです。(出力は のようなメッセージのリストであり、アクションについては言及されていません。)LoggedActionloginactionlogoutactionu'2012-02-18 18:47:09.105840: knatten

私が求めている動作を取得するための適切な方法はありますか、またはここで間違ったパラダイムを適用しようとしていますか? (私はそうだと思います. のメンバーとして特定のアクションを実行する必要がありますLoggedAction)

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

c++ - 次のコードが100を出力するのはなぜですか?

私は次の構造体を持っています

次のコードが100を出力する理由を説明してください:(10 + 0)

1111を出力する必要があると思います。最初にA():i = 0、次にB1():i = 1で、B1::f()-11を出力し、次にB2():B1::f()11を出力します。

どこが悪いの?

ありがとう

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

c++ - 仮想継承で非仮想ベースメソッドを呼び出すための追加コストはありますか?

私はこの質問を参照しました(タイトルを変更しました)。virtualnessに関連するコード生成は実装固有であることを認識しています。virtualただし、以前の質問は、非仮想ベースメソッドを呼び出す場合、継承に関連する追加コストがあることを示唆しています。

私は次のテストコードを書き、そのアセンブリをg ++(with -O4)でチェックしました:

共通部分

今、違いの部分はここにあります:

コード1(通常の継承)

コード2(仮想継承)

コード3(複数の仮想継承)

ここに全体的なコード

組み立てを確認したところ、3つのバージョンすべてに違いはありません。そして、以下はアセンブリコードです:

virtual特定の最適化がオンになっている場合、継承に追加のコストがかからないということですか?これを評価するために、もっと複雑なテストコードを実行する必要がありますか?最適化を行わないと、これらのアセンブリ間に違いが生じることに注意してください。

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

c++ - 仮想継承と同名メンバー

次のクラスがあります。

そして、次のコード:

出力:

何故ですか?Med1コンストラクターは、コンストラクターの後に呼び出さBaseれます。私はそれが設定Med1::xであると推測していますBase::xが、なぜDer::x同じでBase::xあり、そうでないのですかMed1::x。なぜあいまいさがないのですか?

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

c++ - 複数の (仮想) 継承に関係するオブジェクトを削除すると、無効なブロックがクラッシュするのはなぜですか?

この質問を編集して、読みやすく、不自然さを軽減しています。次の短いコードで問題を再現できました。問題は、~A() の "delete p" 行で _BLOCK_TYPE_IS_VALID(pHead->nBlockUse) のアサーションが失敗すると、なぜこれがクラッシュするのかということです。

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

c++ - 純粋な仮想 (インターフェイス) クラスから仮想的に継承することは良い規則ですか?

現在のプロジェクトの異なるクラスの実装間の依存関係を減らすために、私はしばしば純粋な仮想クラス (インターフェイス) を使用します。他の純粋仮想クラスを拡張する純粋仮想クラスと非純粋仮想クラスを持つ階層を持つことさえ珍しくありません。このような状況の例を次に示します。

と の両方が実質的RunnableEngineRenderingEngine拡張Engineされるため、ダイヤモンドの問題は影響しませんSimpleOpenGLRenderingEngine

ダイヤモンドの問題が発生したときに対処するのではなく、ダイヤモンドの問題に対して予防的なスタンスを取りたいと考えています。クラスを変更して、特定のクラス階層を作成できるようにします。たとえば、ボブがこれを行いたい場合:

これは、仮想的にSimpleOpenGLRenderingEngine拡張しなければ不可能でした。ボブがこれをやりたがる可能性は非常に低いかもしれないことは承知しています。RenderingEngine

そこで、純粋仮想クラスを常に仮想的に拡張するという慣習を使い始めたので、それらからの多重継承によってダイヤモンドの問題が発生することはありません。おそらくこれは、私が Java 出身で、非純粋仮想クラスで単一継承のみを使用する傾向があるためです。状況によってはおそらくやり過ぎだと思いますが、この規則を使用することの欠点はありますか? これにより、パフォーマンス/機能などに問題が発生する可能性はありますか? そうでない場合、最終的に必要とされないことが多い場合でも、規則を使用しない理由がわかりません。