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

c++ - C ++では、ほとんどの場合、仮想継承を使用する必要がありますか?

このエントリから、仮想継承によってオブジェクトのメモリフットプリントにsizeof(pointer)が追加されることがわかります。それ以外に、デフォルトで仮想継承を使用し、必要な場合にのみ従来の継承を使用することには、何か欠点がありますか?将来性のあるクラス設計につながるようですが、落とし穴がないかもしれません。

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

c++ - C++ でのプライベート継承とパブリック継承の同時実行

クラスがクラスYをパブリックに継承するとしXます。クラスがパブリックに継承しながらZプライベートに継承することは可能ですか?YX

これをより明確にするために、パブリック メソッドと をX定義するとします。メソッドを継承し、オーバーライドし、提供します。C++ では、3 番目のクラスをサブクラス化して、その実装をプライベートに利用できるようにすることができますが、外部の世界では、それがパブリックに継承されている、つまりパブリック メソッドが 1 つしかないことがわかりますか?x1x2YXx1yZYYx1yXx2

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

c++ - 仮想継承が優れた設計である場合

EDIT3:答える前に、私が何を求めているのかを明確に理解してください(EDIT2と周りにたくさんのコメントがあります)。質問の誤解を明確に示す多くの回答があります(またはありました)(それは私のせいでもあることを知っています、申し訳ありません)

こんにちは、C++ での仮想継承 ( class B: public virtual A {...}) に関する質問を調べましたが、私の質問に対する答えが見つかりませんでした。

仮想継承にはいくつかの問題があることは知っていますが、私が知りたいのは、どのような場合に仮想継承が適切な設計と見なされるかということです。

IUnknownやのようなインターフェースに言及している人々を見かけました。ISerializableまた、そのiostream設計は仮想継承に基づいています。これらは、仮想継承の適切な使用の良い例でしょうか?それは、より良い代替手段がないからですか?それとも、この場合、仮想継承適切な設計であるからですか? ありがとう。

編集:明確にするために、私は実際の例について尋ねています。抽象的なものを与えないでください。私は仮想継承とは何か、どの継承パターンがそれを必要とするかを知っています。私が知りたいのは、複雑な継承の結果だけでなく、それが物事を行うための良い方法である場合です。

EDIT2: つまり、ひし形の階層 (仮想継承の理由)が良い設計である場合を知りたい

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

c++ - C++ でのネストされた継承

C++ のネストされた継承について質問があります。BaseMiddleおよびの 3 つのクラスがありTopます。通常、 から派生するときはパブリック継承を使用しますが、からプライベートに継承するMiddleクラス ( ) が 1 つありますが、パブリックに使用するメソッドを公開する必要があります...TopMiddleBase

これが私の解決策です。大丈夫ですか?

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

c++ - 仮想継承のパフォーマンスへの影響

リアルタイムアプリケーションで仮想継承を使用することを検討しています。仮想継承を使用すると、仮想関数を呼び出す場合と同様のパフォーマンスへの影響がありますか?問題のオブジェクトは起動時にのみ作成されますが、階層のすべての関数がvtableを介してディスパッチされるのか、仮想基本クラスの関数のみがディスパッチされるのかが心配です。

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

c++ - C++での仮想基本クラスと仮想継承について

重複の可能性:
gccc++仮想継承の問題

こんにちはすべて、私はスコットマイヤーズの本による効果的なC++を読んでいます。仮想基本クラスと仮想継承については、次のように述べられています。

仮想ベースクラスの初期化を管理するルールは、非仮想ベースのルールよりも複雑で直感的ではありません。仮想ベースを初期化する責任は、階層内で最も派生したクラスが担っています。新しい派生クラスが階層に追加されるとき、仮想ベース(直接および間接の両方)の初期化の責任を引き受ける必要があります

質問は上記のステートメントにあり、仮想ベースカルスの初期化のルールは何ですか?また、上記のテキストで述べたように、派生クラスがとらなければならない責任は何ですか。例を挙げて説明をお願いします。

ありがとう!

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

c++ - 派生クラスのメソッドの呼び出しリスト

私はテストフレームワークを開発しています。多数のテスト スイートがあり、それぞれが個々のテストのメンバー関数のセットを持つクラスです。

クラス内のすべてのテストを動的に反復する方法を見つけたいと思います。

理想的なセットアップは次のようになります。

addTest() メソッドは、そのパラメーターをリストに追加します。このリストは後で繰り返され、各メソッドが実行されます。

これを達成する方法はありますか?これまでに思いついた最も近いものは次のとおりです。

メインの実行ループの反復ごとに 1 つのテストを呼び出すには:

すべてのテスト スイート (クラス) が run() コードを繰り返し、独自の mTests メンバーを持つ必要があるため、これは理想的ではありません。

理想に近づける方法はありますか?

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

c++ - ひし形階層の中間で仮想継承を指定する必要があるのはなぜですか?

私はクラスのダイヤモンド階層を持っています:

D で A の 2 つのコピーを回避するには、B と C で仮想継承を使用する必要があります。

質問: あいまいさが D にあるのに、B と C で仮想継承を実行する必要があるのはなぜですか? Dにしたらもっと直感的だったのに。

この機能が標準化委員会によってこのように設計されているのはなぜですか? B クラスと C クラスがサードパーティ ライブラリから来ている場合、どうすればよいでしょうか?

編集: 私の答えは、派生オブジェクトが作成されるたびに A のコンストラクターを呼び出すべきではないことを B および C クラスに示すことでした。これは、D によって呼び出されるためです。

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

c++ - C++ での仮想継承

C ++での仮想継承について読んでいるときに、Webサイトでこれを見つけました

多重継承を使用する場合、仮想継承を使用する必要がある場合があります。これの良い例は、標準の iostream クラス階層です。

仮想メンバーから派生したクラスの数に関係なく、仮想メンバーのインスタンスが 1 つしか存在しないことを C++ はどのように保証しますか? C++ は追加レベルの間接化を使用して、通常はポインタを使用して仮想クラスにアクセスします。つまり、iostream 階層内の各オブジェクトには、ios オブジェクトの共有インスタンスへのポインターがあります。追加レベルの間接化により、パフォーマンスのオーバーヘッドがわずかに発生しますが、支払う代償はわずかです。

私は声明と混同しています:

C++ は追加レベルの間接化を使用して、通常はポインターを使用して仮想クラスにアクセスします。

誰もこれを説明できますか?

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

c++ - 仮想継承で「公開仮想」または「仮想公開」と書くべきですか?

http://en.wikipedia.org/wiki/Virtual_inheritanceに基づく

また、本が次の構文を使用しているのを見ました。

質問> C++ 標準の 1 つはどれですか?

ありがとうございました