問題タブ [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++多重継承
C ++でクラスFooを定義して、次のようにする方法はありますか?
- 私はそれから継承することができます
- そこから「ダイヤモンド継承」できない
つまり
c++ - C++ プライベート仮想継承の問題
次のコードでは、クラス C は仮想継承のために必要な A のコンストラクターにアクセスできないようです。それでも、コードはコンパイルおよび実行されます。なぜそれが機能するのですか?
さらに、Aからデフォルトのコンストラクターを削除すると、たとえば
それから
(予期せず)コンパイルされますが、
予想どおり、コンパイルされません。
「g++ (GCC) 3.4.4 (cygming special, gdc 0.12, using dmd 0.125)」でコンパイルしたコードですが、他のコンパイラでも同様に動作することが確認されています。
c++ - 純粋な仮想クラスとコレクション (ベクター?)
仮想クラスをかなり広範囲に使用するグラフィックス アプリケーションに取り組んでいます。それは持っています:
基本的に形状のコレクションである画像クラス。
純粋に仮想であり、それから継承するいくつかのクラスを持つ shape クラス:
- サークル
- ポリゴン
- 矩形
任意のグラフィカル フィギュア (仮想でもある) である Figure シェイプは、これから継承します。
基本的に、私の問題は、基本的に形状のコレクションを格納するために使用されている画像クラスの実装に帰着します。現在、形状を保存するためにベクターを使用していますが、ベクターがこれらの形状をインスタンス化するため、これが間違った決定であることは明らかです。これらは純粋に仮想であるため、これは適切ではありません。
以下は私の現在のコードベースです(少し要約):
私が得ているエラーメッセージは、これらのほんの一握りです:
picture.cpp:33: ここからインスタンス化 /opt/local/bin/../lib/gcc/sparc-sun-solaris2.10/4.4.1/../../../../include/c++ /4.4.1/ext/new_allocator.h:105: エラー: 抽象型 'Shape' shape.h:12 のオブジェクトを割り当てることができません: 注: 次の仮想関数は 'Shape' 内で純粋であるため: shape.h:58 : note: virtual void Shape::get(std::istream&) shape.h:31: note: virtual void Shape::put(std::ostream&) const shape.h:36: note: virtual void Shape::scale (const Point&, double) shape.h:40: 注: 仮想ボイド Shape::translate(double, double) shape.h:45: 注: 仮想ボイド Shape::reflectHorizontally(double) shape.h:49: 注: virtual void Shape::reflectVertically(double) shape.h:52: 注: virtual RectangularArea Shape::boundingBox() const 形状。h:21: note: virtual Shape* Shape::clone() const shape.h:55: note: virtual void Shape::draw(Graphics&) const
では、これらの形状を保存する理想的な方法は何ですか。これらのものを保存するには、どのようなコレクションを使用する必要がありますか?
ありがとう
c++ - 仮想継承: 基本 Ctor が最も派生したクラスで呼び出されていませんか?
上記の場合、 forZ():X(10){}
Base(int k):a(k)
は呼び出していませんが、に変更するとZ():Base(10){}
、Base(int k):a(k)
が呼び出されます。なんで ?
ありがとうございました。
c++ - 仮想継承は「ダイヤモンド」(多重継承) のあいまいさをどのように解決しますか?
ダイヤモンドの問題は理解していますが、上記のコードにはその問題はありません。
仮想継承はどのように問題を解決しますか?
私が理解していること:
私が言うA *a = new D();
と、コンパイラーは、型のオブジェクトを型D
のポインターに割り当てることができるかどうかを知りたがってA
いますが、たどることができる 2 つのパスがありますが、それ自体では決定できません。
では、仮想継承はどのように問題を解決するのでしょうか (コンパイラが決定を下すのに役立ちます)。
c++ - 仮想継承階層に関する質問
仮想継承に取り組むときにこの問題が発生します。非仮想継承階層では、サブクラスのオブジェクトがその直接のスーパークラスのオブジェクトを保持していることを覚えています。仮想継承についてはどうですか?この状況では、サブクラスのオブジェクトはそのスーパークラスのオブジェクトを直接保持しますか、それとも単にそのスーパークラスのオブジェクトを指すポインターを保持しますか?
ちなみに、なぜ次のコードの出力は次のとおりです。
コード:
前もって感謝します。敬具。
c++ - C++ でのあいまいな this ポインターの解決
古いクラスから新しいクラスを派生させようとしています。基本クラスの宣言は次のようになります。
そのコンストラクタは次のようになります。
したがって、派生クラスを作成したとき、最初に基本クラスから単純に継承しようとしました。
コンストラクターをコピーします。
コンパイラ (Analog Devices の VisualDSP++ 5.0) はこれを気に入らなかった:
これは理にかなっていたので、Plugin と CmdObject から直接継承することにしました。複数の継承のあいまいさの問題を回避するために (そう思ったので)、仮想継承を使用しました。
しかし、NewDriver の仮想メソッドの実装で、Plugin* を受け取る Mgr::RegisterPlugin メソッドを呼び出そうとしたところ、次のようになりました。
this ポインターはどのようにあいまいで、どうすれば解決できますか?
ありがとう、
――ポール
c++ - 多重継承を持つクラスをキャストできません
既存の機能をそのままにして、一部のコードをリファクタリングしようとしています。オブジェクトへのポインタをベースインターフェイスにキャストし、後で派生クラスを取得するのに問題があります。プログラムは、ファクトリオブジェクトを使用して、特定の場合にこれらのオブジェクトのインスタンスを作成します。
これが私が扱っているクラスのいくつかの例です。
この質問には、さまざまなタイプのキャスティングが何をするかについての良い情報がありますが、それは私がこの状況を理解するのに役立ちません。static_castと通常のキャストを使用するとerror C2594: 'static_cast': ambiguous conversions from 'MyObject *' to 'ISerializable *'
。dynamic_castを使用すると、createObject()はNULLを返します。NormalObjectスタイルクラスと古いバージョンのMyObjectは、ファクトリの既存のstatic_castで機能します。
このキャストを機能させる方法はありますか?可能だと思います。
c++ - C++ でのメソッド解決順序
次のクラス階層を検討してください。
- 仮想メソッド foo() を持つ基本クラス オブジェクト
- 複数の継承 (仮想および非仮想) を持つ任意の階層。各クラスは Object のサブタイプです。それらのいくつかは foo() をオーバーライドし、いくつかはオーバーライドしません
- foo() をオーバーライドしない、この階層のクラス X
C++ のクラス X のオブジェクトで foo() の呼び出し時に実行されるメソッドを決定する方法は?
(特定のケースではなく、アルゴリズムを探しています。)
c++ - 複数の仮想継承と型キャストのための仮想テーブルと仮想ポインタ
vptr とメモリ内のオブジェクトの表現について少し混乱しています。問題をよりよく理解するのに役立つことを願っています。
B
inherits fromA
と、両方が virtual functions を定義することを検討してくださいf()
。私が学んだことから、メモリ内のクラス B のオブジェクトの表現は次のように[ vptr | A | B ]
なります。また、オブジェクトをからにキャストしても、オブジェクトの最後の部分を無視する以外は何もしないことも理解しました。本当ですか?この振る舞いは間違っていませんか?型のオブジェクトがではなく メソッドを実行するようにします。vtbl
vptr
B::f()
B
A
B
A
A::f()
B::f()
クラスの数
vtables
としてシステムにいくつかありますか?vtable
2 つ以上のクラスを継承する of クラスはどのようになりますか? C のオブジェクトはメモリ上でどのように表現されるでしょうか?質問 3 と同じですが、仮想継承があります。