問題タブ [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.
c++ - 複数の仮想継承とは何ですか?
bar and kungクラスは、fooクラス内に実装された純粋仮想メソッドを含む抽象クラスです。
これの用途は何ですか?
c++ - 仮想継承におけるコンストラクター呼び出しの順序
この場合の出力は
なぜこれが参入しないのかin A const
`1 arg コンストラクター呼び出しの順序に従う必要があります。しかし、仮想キーワードを使用して A から B を派生させると実際に何が起こっているのでしょうか。
もう少し質問があります
上記のプログラムで virtual キーワードを削除し、デフォルトのコンストラクターをすべて削除しても、エラーが発生します。では、なぜ def コンストラクターが必要なのか
c++ - 多重継承ダイヤモンド
コードは次のとおりです。
主に、関数を呼び出すとanalyzeJetPerformance (& myJetCar )
、コンパイラは私が期待したものを提供しませJat flying
ん。JetCar flying
ここで何が問題なのですか?
c++ - virtual キーワードによって派生クラスのサイズが大きくなるのはなぜですか?
私は2つのクラスを持っています.1つは基本クラスで、もう1つはそれから派生したものです:
ここでの答えは 16 です。しかし、代わりに非仮想パブリック継承を行うか、基本クラスを非ポリモーフィックにすると、答えは 12 になります。
また
どちらの場合も、答えは 12 です。
1番目と他の2つのケースで派生クラスのサイズに違いがある理由を誰かが説明できますか?
(誰かが本当にこれを必要とする場合、私はコード::ブロック10.05に取り組んでいます)
c++ - 仮想継承は派生クラスのサイズを増やしますか?
重複の可能性:
仮想のオブジェクト サイズ
仮想継承は派生クラスのサイズを変更しますか? 次のコードを実行しました。ここでは、1 つは仮想的に継承され、もう 1 つは非仮想的に継承された 2 つの派生クラスがあります。
出力:
12 (imo: 4(int a)+ 4(int c)+ 4(vir ptr))
16 (余分に 4 ?)
何かを見逃していないかどうかを再度確認するために、クラス内のすべての int を削除して、必要な最小限のコードを試してみました。出力は次のとおりです。
4
4
2 番目の出力は、2 つの派生クラスが同じサイズであることを示しています。最初の実行で vir_der のサイズが 16 になるのはなぜですか? なぜ 12 ではないのですか?
javascript - 複数のレイヤーを持つ Javascript の継承: A->B->C、A の関数を C で使用
JavaScript では、次のことを達成したいと考えています。
クラス A (配列) -> クラス B (EntityContainer) -> クラス C (EntityList)
コード内:
もちろん、継承は「inheritsFrom」関数にカプセル化できます。
これは、(this.length を使用して) すべての要素を反復処理するときに、EntityList 内で "this[i]" を呼び出すことができることを達成する正しい方法ですか?
ここで改善できることはありますか?
みんなありがとう!
c++ - 仮想継承とインターフェース
上記のように、常にインターフェイスを仮想として継承しますか? そうでない場合、上記のコードをどのように実装しますか?
c++ - C++ コンストラクター: この仮想関数呼び出しが安全でないのはなぜですか?
これは、C++11 標準の sec 12.7.4 からのものです。これはかなり紛らわしいです。
- テキストの最後の文は正確には何を意味していますか?
- 最後のメソッド呼び出しが
B::B
未定義なのはなぜですか? 呼ぶだけじゃないのa.A::f
?
4 仮想関数 (10.3) を含むメンバー関数は、構築または破棄 (12.6.2) 中に呼び出すことができます。クラスの非静的データ メンバーの構築中または破棄中を含め、コンストラクタまたはデストラクタから仮想関数が直接的または間接的に呼び出され、呼び出しが適用されるオブジェクトが構築中のオブジェクト (x と呼ぶ) である場合または破壊の場合、呼び出される関数は、コンストラクタまたはデストラクタのクラスの最終オーバーライドであり、より派生したクラスでそれをオーバーライドするものではありません。仮想関数呼び出しが明示的なクラス メンバー アクセス (5.2.5) を使用し、オブジェクト式が x またはその基本クラス サブオブジェクトの 1 つではなく、x またはその基本クラス サブオブジェクトの 1 つの完全なオブジェクトを参照する場合、動作は未定義です。 . [ 例:
—終わりの例]
c++ - 「多段継承の場合の仮想基底クラス」に意味はあるのか
複数レベルの継承を示す次のサンプル コードを検討してください。
Case1 : ここでは、クラスderived1
はbase
仮想継承によってクラスから派生し、クラスはクラスから直接derived2
派生します。derived1
Case2 : 仮想継承が関係しないことを除いて、Case1 と同じです。
derived2
どちらの場合も、クラスのオブジェクトを作成するとします。
のオブジェクトに含まれるサブオブジェクトに関して、Case1 と Case2 はどのように異なります
derived2
か?Case1 は Case2 よりも重要ですか?
PS: 多重継承中の仮想基本クラスの重要性は明らかです。
c++ - C++ の「三角形」(ひし形ではない) の継承
(ここでダイヤモンドと仮想の継承に関する質問を検索して読みましたが、答えを見つけることができませんでした。私の考えでは、この状況は少し異常であり、私の要件が多少ずれているという考えを喜んで受け入れるつもりです。オン一方、これは「いい」方法で実行できるはずだと思います。)
状況と要件:
私は、自分では制御できず、変更できない C++ クラス ライブラリを持っています。クラスを定義しWindow
ます。クラスには、派生クラスが使用することを意図した、他の方法ではアクセスできないWindow
保護されたメンバー (たとえば: ) があります。何百もの(まあ、非常に多数の...)メソッドを定義しています。handle
Window
に機能を追加してWindow
、派生クラス (私が書いた; と言うLogWindow
) が自動的に持つようにしたいと考えています。このような機能の例として、ウィンドウを相互にスナップする機能があります。これを実装するには、Window
の保護されたhandle
メンバーにアクセスする必要があります。
私の実際の目的にはこれで十分であり、解決策はSnappableWindow
簡単です。Window
Window
LogWindow
SnappableWindow
しかし、私が本当に欲しいのは、よりきれいな私見ですが、次のとおりです。
- この「Snappable」機能をスタンドアロンのコードとして持つ機能。他の
Window
派生クラスに「プラグイン」するかどうかを選択できます。 - この概念を他の機能にも拡張する機能 (たとえば、ウィンドウを最小化する機能)。したがって
Window
、「スナップ可能」機能の有無にかかわらず、「最小化可能」機能の有無にかかわらず、派生クラスを持つことができます。 - 「SnappableWindow」と「MinimizableWindow」の実装は、どちらも
Window
のhandle
保護されたメンバーにアクセスする必要があります。 - 「スナップ可能」と「最小化可能」を実際のクラス宣言の一部にして、実際のクラス (
LogWindow
) が「ウィンドウ」、「スナップ可能ウィンドウ」、「最小化可能ウィンドウ」になるようにしたいと考えています。
...そして今、質問に:
SnappableWindow
andMinimizableWindow
を宣言することでこれを行う方法を理解しますから派生するのではなく、コンストラクターでWindow
a を取得し、と の任意の組み合わせから派生します。handle
LogWindow
Window
SnappableWindow
MinimizableWindow
編集:の init()を呼び出した後、LogWindow のコンストラクターの途中handle
で初期化されます。(前に述べたように、 のコンストラクターの途中ではありません)。Window
Window
Window
ただし、handle
は のコンストラクタの途中でしか初期化されないため (のLogWindow
を呼び出した後)、のコンストラクタ初期化リストの一部としておよびに渡すことはできません。むしろ、両方で何らかのメソッドを明示的に呼び出して、 . そして、これは、私の派生クラスのそれぞれにあります。( 、、など)Window
init()
SnappableWindow
MinimizableWindow
LogWindow
init()
handle
Window
LogWindow
SearchWindow
PreferencesWindow
次のようなことができる方法を探しています。
クラス LogWindow : public Window、public SnappableWindow、public MinimizableWindow
... 内に他のものを実装する必要はありませんLogWindow
。仮想継承をいじりましたが、解決策が思いつきません。