問題タブ [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++ - C ++仮想継承はコンパイラでどのように実装されますか?
コンパイラは仮想継承をどのように実装しますか?
次のコードでは:
コンパイラーは、B::ctor
関数の2つのインスタンスを生成しますか?1つは呼び出しなし、もう1つはA(1)
呼び出しありですか?したがって、B::constructor
が派生クラスのコンストラクターから呼び出されると、最初のインスタンスが使用されます。それ以外の場合は、2番目のインスタンスが使用されます。
c++ - 単一の仮想継承
基本クラスの仮想継承により、複数の派生クラス間で共通の共有基本クラスが作成され、DDD の問題が解決されることを理解しています。基本クラスの派生クラスが 1 つしかない場合、基本を仮想的に継承する場合と非仮想的に継承する場合に違いはありますか? 基本的には、クエリで提供される説明を理解しようとしていますコンパイル時にクラスからの派生を禁止することは可能ですか? ここで、Usable クラスからの派生を防ぐために、Usage_lock 基本クラスが仮想的に継承されます。この仮想キーを削除すると、動作が変わります。つまり、Usable からサブクラスを派生させることができます。したがって、単一継承シナリオでの仮想キーによる違いの原因を理解したいと思います。
c++ - 仮想継承が関係している場合、static_cast を使用してダウンキャストできないのはなぜですか?
次のコードを検討してください。
これは標準 ( ) で禁止されているため、実質的にから継承される[n3290: 5.2.9/2]
ため、コードはコンパイルされません。を継承から削除すると、コードが有効になります。Derived
Base
virtual
このルールが存在する技術的な理由は何ですか?
c++ - 抽象クラスを仮想的に継承するパラメーター化されたコンストラクター
私は古典的な仮想継承ダイヤモンドを持っています:
B
andで NULL を使用しますC
。これらは抽象クラスであるためA
、コンストラクターで ctor が呼び出されることはありません。NULL
コンストラクターで指定するか、パラメーターなしのコンストラクターを宣言する以外に、それを行うためのより良い方法はありますA
か? コンストラクターをパラメーターで呼び出す必要があるため、A() {}
ctor は抽象クラスでのみ許可する必要があります。
c++ - 派生クラスに基本実装を使用してインターフェースを満たす方法
次の2つのインターフェイスがありますが、これらは継承階層の一部ではありません。次に、2つの具体的なクラスがあります。1つはもう1つから派生しています。
コンパイルすると、次のエラーが発生します。
fastCarで関数を記述して、drive()を基本クラスに委任すると、プログラムは機能します。
基本クラスに委任するメソッドを記述せずにFastCarをコンパイルすることは可能ですか?
注:ICarとIFastCarは、2つの異なるチームによって作成され、2つの異なるプロジェクトに属しています。チームは、共有される操作の共通メソッドシグネチャについて合意しました。実装クラスで継承を使用して、同じ実装の部分を再利用しようとしました。
c++ - C++ での仮想継承によるクラス サイズ
答えはコンパイラに依存しますが、これを結果として見たときは驚きました
virtual キーワードを削除すると、割り当てられるサイズはそれぞれ 4 と 8 になり、これは予想どおりです。
余分なスペースが正確に占有されているのはなぜですか? vptr テーブルまたはそのようなもののためだと思われますが、確かなことはわかりません。
c++ - 仮想継承の混乱
継承について読んでいて、何時間も解決できなかった大きな問題があります。
Bar
クラスがvirtual
関数を持つクラスであるとすると、
次の違いは何ですか:
と
? 何時間にもわたってグーグルで調べたり読んだりして、その使用法に関する多くの情報が得られましたが、実際には 2 つの違いが何であるかを教えてくれるものはなく、さらに混乱するだけです。
c++ - C++抽象基本クラスコンストラクタ/デストラクタ-一般的な正しさ
Interface
継承時に(可能であれば)オーバーライドする必要があるC++が欲しいのですが。これまでのところ、私は次のものを持っています:
コンストラクタ/デストラクタをで実装する方法を意図的に残しましたICommand
。コメントを削除すると、コンパイルされません。誰かがしてください:
- でコンストラクタ/デストラクタを宣言する
ICommand
方法と、それらがでどのように使用されるのかを教えてくださいMyCommand
- をオーバーライドする必要が
ICommand
あるように、で正しく設定しましたか。MyCommand
CallMe
CallMe2
c++ - 特定のクラスの仮想継承を検出してアサートする方法は?
参照カウントを実装する C++ クラスがあり、このクラスのすべてのユーザーがこのクラスから仮想的にのみ継承するようにして、オブジェクトが複数の参照カウンターを持たないようにします。
コンパイル時または少なくとも実行時に、この要件をアサートする何らかの方法が必要です。
それを達成する方法はありますか?
c++ - クラスにおける「仮想」の意味
次のケースでvirtual
は、クラス A のサブオブジェクトを B および C と共有するダイヤモンド問題を解決するために使用されます。
例えば:
このタイプの継承は、コンパイル時または実行時に解決されますか? つまり、関数とクラスで使用された場合、virtual の意味はどのように異なるのでしょうか? 仮想を使用して基本クラスから継承する場合、動的バインディングの概念はありますか?