問題タブ [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++ - 純粋な抽象クラス (インターフェース) からの仮想継承が必要か
以下のコードで、コンパイラPureAbstractBase
が のあいまいな基本クラスであると不平を言うのはなぜMultiplyInheritedClass
ですか? PureAbstractBase
inとMultiplyInheritedClass
thatの 2 つのコピーがあり、それらがひし形の中央の行であるため、仮想的に派生する必要があることに気付きました (実際、以下のコードの問題を解決しています)。しかし、インターフェイスのコピーが 2 つあるにもかかわらず、 のコードが両方をオーバーライドして、 で定義されたインターフェイス クラスを明確に選択しないのはなぜですか?FirstConreteClass
SecondConreteClass
MultiplyInheritedClass
MultiplyInheritedClass
さらに、次の階層で問題が発生しないのはなぜですか? この場合、ConcreteHandler クラスには AbstractTaggingInterface のコピーが 3 つありませんか? では、なぜ上記の例と同じ問題が発生しないのでしょうか?
最近同僚と話をしたところ、データ メンバーなしで純粋な仮想クラス (インターフェイス) から継承する場合、仮想継承は必要ないと主張したため、これらすべてについて頭を悩ませようとしています。前者のコード例が機能せず、後者が機能する理由を理解することは、これを頭の中で理解するのに大いに役立つと思います(そして、彼のコメントが正確に何を意味していたのかを明確にします)。前もって感謝します。
c++ - 仮想継承と仮想関数は同じ vtable を使用しますか?
少し関連する質問が 1 つあります。しかし、話題はまったく異なります。
さて、1 つの概念は関数の解決に関するもので、別の概念はclass
解決に関するものですか? vtable
彼らが同じものを使用している場合(少なくとも gcc-4.5 で) 、どうすれば可能なのでしょうか?これはコンパイラに依存する用語ですか?
それが基本的なばかげた質問に見えるかもしれないことは知っていますが、私はそれを考えたことはありませんでした.
oop - コードなしの最初の非抽象仮想メソッドの特別な名前?
この質問は、別の同様の質問から来ています。時々、私はこのケースに対処しなければなりません。
virtual
オブジェクト指向プログラミングで、宣言された初期メソッドの特別な名前が存在するかどう か知っていabstract
ますか?
この例は疑似コードですが、あらゆる OO プログラミング言語に適用されます。
方法MyBaseClass::MayDoSomething()
はその場合です。
乾杯。
c++ - 親関数内で上書きされた子関数を呼び出す
C ++で親関数から子関数を呼び出すことは可能ですか?
例を見てみましょう: 親クラスは関数 (解析) で一般的なワークフローを定義します。次にワークフローは、フローの一部を表すさまざまなメソッドを呼び出します (parseElementA)。これらの関数は、親の一部である標準関数が使用されない場合、子クラスによって上書きできます。
私の問題は、子オブジェクトを作成し、ワークフロー関数 (解析) を実行することです。上書きされた関数 (parseElementA) がワークフロー関数内で呼び出されると、子からではなく親から関数が呼び出されます。子で上書きされた関数を呼び出すために何ができますか。
出力は親です。子を返すにはどうすればよいですか。
アドバイスをありがとうございました。
c++ - 単一の仮想継承では、恐ろしいダイヤモンドの問題を解決できないのはなぜですか?
上記のコーディングを行っても、コンパイラは次のD2
ことも要求しますvirtual
。
私が理解していないのは、(経由で)コンパイラB
にプロンプトを表示virtual
した後、なぜそれがまだ曖昧なのかということです。DD
D1
i
(私の記憶が正しければ、古いVC++(2006年)は、単一virtual
継承だけでこれを理解するのに十分な能力がありました)
c++ - 優位性警告による C++ 継承
多くのインターフェイスを実装するかなり大きなオブジェクトを実装しようとしています。これらのインターフェイスの一部は、純粋な仮想です。ダイヤモンドの継承に問題がある可能性があります。Visual Studio は の警告を報告していますC4250 ('class1' : inherits 'class2::member' via dominance)
。まず第一に、これらのクラスは本来あるべき姿で事実上継承されます。以下は、この問題の原因となる部分クラスの設計です。
このツリー全体では、D のみが仮想メソッドを実装しており、問題のメソッドの他の定義はありません。また、B のすべての仮想メソッドが警告にリストされます。重要な場合、D は完全なクラスです。
これはBoostシリアライゼーションで発生することを読みましたが、警告を無視しても安全です。
私が達成しようとしているこの方法は有効ですか?この警告を無視しても安全ですか?
注 1:これはVisual Studio Compiler warning C4250 ('class1' : inherits 'class2::member' via dominance)の複製ではありません。そこで提案された解決策を試しました。
注 2:クラス図も送信できますが、これよりも少し複雑です。
編集: 完全な警告は次のとおりです。
gge::resource::ImageResource
は Big in the drawing、gge::graphics::ImageTexture
は D、drawin は、私が警告を受ける 6 つのメソッドの 1 つです。
c++ - C++、vs 2010 でのあいまいな継承エラー
この例では、ポリモーフィズムの適用に問題があります。この質問は私の最後の質問に似ています
3 つの抽象クラスがあります。
および仮想継承を使用した 2 つの継承されたクラス
上記のエラーは MSVS 2010 コンパイラを使用した場合にのみ発生し、g++ はこのコードを正常にコンパイルします。
クラス図(簡略)
最後に、クラス C から copy() メソッドの宣言を削除します。
ポリモーフィズムを使用するサンプル コードでは、C へのポインターのベクトルを作成する必要があります。いくつかの要素を削除した後、そのコピーを作成したいのですが、クラス C で copy() の宣言が必要なため、宣言の削除では不十分でありません。問題を解く。
VS 2010 を使用して翻訳可能になるようにコードを修正する方法を教えてください。
c++ - 仮想継承の優位性
C++98/C++03 標準および C++0x の将来の標準の、仮想継承における優位性に関する正確な規則は何ですか?
特定の段落だけを求めているわけではありませんが、それも求めています (セクション 10 のどこかだと思います)。
私は標準語の結果についても尋ねています、標準語は明確に説明しました。
c++ - 多重 (ひし形) 継承は「仮想」なしでコンパイルできますが、「仮想」なしではコンパイルできません。
次のコードが与えられた場合 (仮想継承なし):
コードをコンパイルします。
一方、ここでは:
コンパイラはコンパイル エラーを表示します。
2 番目のコードで異なるのはなぜですか?
c++ - Virtual inheritance (diamond) - Why do I need to upcast to Base class from the most Derived class
consider the following :
As you can see , I added in class C
the implementation of C's Ctor (constructor) . What is not clear to me is why do I need also the upcast from C to A , if B1 does that job for me in its Ctor ?
Meaning , if I wrote C's Ctor as :
why can't I write :
thanks , Ronen