問題タブ [object-slicing]
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++ - コピー コンストラクターの欠如は、オブジェクトのスライスとどのように関連していますか?
警告: これはWhat is object slicing?の複製ではありません。、私はすでにそれを読みましたが、私の問題を明確にしません
私の質問は、コピー コンストラクターの欠如が、オブジェクトのスライスに関する基本クラスで問題になるのはなぜですか? 私が何かをするなら
これはそもそも古典的なスライスの問題です! Base でユーザー定義のコピー コンストラクターを定義することが役立つ理由や方法がわかりません
編集:これらの回答: https://stackoverflow.com/a/26040064/1938163およびhttps://stackoverflow.com/a/26040050/1938163は、コピーコンストラクターを定義/デフォルト設定する必要があることを暗示しているように見えるため、これを求めていますオブジェクトのスライスに対処する
c++ - スライスはなぜ起こるの?
次のコードを検討してください。
このような場合、「スライス」が発生することはよく知られています。C++ では、基本型の変数に派生型のオブジェクトを割り当てることはできません。オブジェクトは、基本型で定義されていないものから「スライス」されます。(そのようなことをしたい場合は、ポインターまたは参照を使用する必要があります)。
この本当の理由を理解したい。Base
つまり、変数がDerived
オブジェクトをスライスせずに保持できない理由です。
この理由は、Base
オブジェクトとオブジェクトが同じサイズではない可能性があるためであり、オブジェクト全体を変数Derived
に格納できることを保証できないためだと思います。aは 4 バイトを使用する場合がありますが、aは 7 バイトです。そのため、基本型のサイズに合わせて派生オブジェクトを常にスライスすることにしました。Derived
Base
Base
Derived
ポインターはすべて同じ量のメモリを占有するため、ポインターを使用してこれを行うことができます。
この仮定は正しいですか?そうでない場合、スライスの実際の理由は何ですか?
c++ - ベクトル内でのクラスのスライス
スライスに問題があると思いますが、修正方法がわかりません。実際のプログラムの問題を以下の例にまとめました。
出力はですUsing Base :(
が、私は期待していUsing First_Derived!
ました。問題は、First_Derived
オブジェクトがベクターに格納されると、型に変換されるため、そのBase_Objects
固有の機能が失われることだと思いますか? これに対する解決策はありますか?「オブジェクト スライスとは何ですか?」に記載されている解決策のいくつかを適用しようとしました。しかし、私はそれらを正しく適用しているとは思いません。Use()
Base
c++ - C++ ポリモーフィズム、派生クラスの名前解決
-C++ は contravaraint 戻り値の型をサポートしていないため、f(int) は f(float) をオーバーライドしません。
-ポリモーフィズムは C++ でサポートされているため、d と b の両方が派生クラスの vtable を指す必要があります。
派生クラスの -vtable は、0: f(float)、1: f(int) などです。
質問に対する私の答えは Base::f(float) が2回呼び出されることですが、答えは次のとおりです。
Base::f(float) 派生::f(int)
これはなぜですか?別のポインターから派生クラスにアクセスすると、特定の規則が適用されますか? 私の知る限り、オブジェクトのスライスは、copy-ctor または copy-assignment を使用している場合にのみ発生し、ポインターを使用すると、それらはすべて同じ vtable を指す必要があります。
c++ - C++ でのスライスと演算子のオーバーロード
背景情報
私はしばらく Java でプログラミングをしてきましたが、C++ に切り替えたのはほんの数か月前です。以上で、いよいよ本題です!私は基本的なテキスト ベースのゲーム エンジンを開発していますが、最近、興味深い具体的でありそうもない問題に遭遇しました。以下のプログラムで小規模にテストしてみましたが、(実際のゲーム コードとは対照的に) 画面を詰まらせず、問題の複雑さを軽減するために、(実際のゲーム コードとは対照的に) 表示することにしました。以下にモデル化された問題は、私の実際のコードの問題を反映していますが、ふわふわした邪魔者はありません。
問題
本質的に、問題はポリモーフィズムの 1 つです。出力演算子「<<」をオーバーロードして、階層内の各オブジェクトに固有の表示関数として機能させたいと考えています。問題は、これらの階層メンバーを格納するリストからこの演算子を呼び出すと、ID が失われ、基本クラスの出力演算子が呼び出されることです。通常、オペレーターのオーバーロードを単純な表示メソッドに置き換え、表示メソッドを仮想としてマークし、幸せな一日に進むことでこれを解決します。コードを変更することは特に気にしませんが、今は単純に興味があります。私がここで行っていることになる階層内の演算子をオーバーロードする方法はありますか?
【例】コード
[例] コードの出力
[例]コードの望ましい出力
c++ - std::enable_if 使用時のオブジェクトのスライス
std::enable_if
サブクラスの1つに特定のメンバー関数が定義されている場合、クラスを特殊化するために使用しようとしています。それ以外の場合は、基本クラスで定義されている既定の実装を使用する必要があります。
私はこれが印刷されることを期待していたでしょう
しかし、代わりに私は得る
オブジェクトのスライスが発生しているようです。誰かが私を助けてくれれば、なぜこれが当てはまるのか、私の人生では理解できません。
それが何らかの形で役立つ場合、これはg ++ 4.7.2でコンパイルされています
c++ - 子メソッドの呼び出し
私の C++ プロジェクトには、Trap というクラスがあります。トラップは NPC であり、NPC はエンティティです。今、私はすべての NPC をループして、それらを処理したいと考えています。たとえば、トラップを更新したいとします。私は次の方法でそれを行います。
しかし今、Update() 呼び出しは NPC::Update() メソッドを呼び出しています。
これは、イテレータの使用方法が原因であると確信していますが、これをより適切に行う方法がわかりません。別の種類の反復を使用しますか? これには簡単なトリックがありますか?