問題タブ [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.

0 投票する
3 に答える
438 参照

c++ - このメソッド呼び出しが予想どおりに仮想化されないのはなぜですか?

ポインターなしで仮想関数を使用するとどうなりますか? 例えば:

^^なぜうまくいかないのですか?仮想メソッドが実際にどのように機能するかについては、どこで確認できますか?

0 投票する
4 に答える
213 参照

c++ - 基本ベクトルの要素で派生メソッドを呼び出す(例を示します)

次のようなクラスの構造があるとします。動物ベクトルの要素がどのクラスタイプであるかを判別できるようにしたいので、サブクラス固有のメソッドを実行できます。以下の例は、次のことを示しています。

明らかに、マークされたコードは機能しませんが、どうすればやりたいことを実行できますか?従うべきであるが従わない回避策または設計原則はありますか?dynamic_castを調べましたが、それがきれいではないことを理解しています。では、どうすれば正しく行うことができますか?

Javaでは、これを行います。

0 投票する
8 に答える
1588 参照

c++ - C ++の学習:参照を返し、スライスを回避する

私は参照を理解する時間の悪魔を持っています。次のコードを検討してください。

そして結果は次のとおりです:「樹皮樹皮rawrrawr」。

Javaの考え方では(これは明らかに私のC ++の概念を破壊しました)、結果は「樹皮樹皮樹皮樹皮」になります。以前の質問から、この違いはスライスによるものであることがわかり、スライスとは何かをよく理解できました。

しかし、実際には犬である動物の値を返す関数が必要だとしましょう。

  1. 私が得ることができる最も近いものが参照であることを正しく理解していますか?
  2. さらに、rFuncインターフェースを使用して、返される参照がAnimal&に割り当てられていることを確認する必要がありますか?(または、スライスを介して多型を破棄する動物への参照を意図的に割り当てます。)
  3. 上記のrFuncで行った愚かなことを行わずに、いったいどうやって新しく生成されたオブジェクトへの参照を返すことになっているのでしょうか。(少なくとも、これはばかげていると聞きました。)

更新:これまでのところ、rFuncは違法であることに誰もが同意しているように見えるため、別の関連する質問が発生します。

ポインターを返す場合、そのポインターが削除するものではないことをプログラマーにどのように伝えるのですか?または、ポインターがいつでも(同じスレッドから異なる関数から)削除されることを通知して、呼び出し元の関数がポインターを格納しないようにするにはどうすればよいですか。コメントを通じてこれを伝える唯一の方法はありますか?それはずさんなようです。

注:これはすべて、私が取り組んでいたテンプレート化されたshared_pimplの概念のアイデアにつながります。うまくいけば、私は数日でそれについて何かを投稿するのに十分なことを学ぶでしょう。

0 投票する
2 に答える
1278 参照

c++ - C++でのオブジェクトスライス

メインで:

こんにちは、みんな、

オブジェクトスライシングを理解し、いくつかのサンプルプログラムを試してみています。

ポインタ参照でどこかを読んだObjcetSlicingは起こりません。

しかし、以下の例では、からiDerivedアクセスできないことに気づいていますが、ローカルスコープのdisplayメソッドに含まれていなくてもアクセスできます。Base pointer(varBase)virtual display method of class

今私の質問は:

  1. 仮想関数でのみiDerived変数にアクセスできるのはなぜですか?これは適切ですか?
  2. オブジェクトのスライスを回避する方法。
0 投票する
5 に答える
1053 参照

c++ - C++のスマートポインタ

baseクラスとがありますderived。それで:

そして今、スマートポインタクラスで上記のクラスを使用してこのコードがあるとしましょう:

derivedのデストラクタを呼び出すことでオブジェクトのスライスを防ぐことができると理解していderivedますが、それをどのように知っているのでしょうか。スマートポインタに格納されている参照は、タイプの参照ではないでしょうbase*か。ある種の階層ツリーをトラバースし、そのポインタをにキャストしてからderived*、deleteを呼び出しますか?それとも私が知らないことが他にありますか?

実装はおそらくスレッドセーフで、邪魔にならず、参照カウントです。

はい、あなたが見るクラスは私がテストしているクラスに似ています。これらの与えられたクラスでこれを行う方法があるようです。上記の私の質問でどのように言及されているかについての主な考えは、そのような実装がどのように機能するかについてはわかりません。

0 投票する
7 に答える
6911 参照

c++ - 仮想関数を (オブジェクトの) 値ではなくポインタで渡す必要があるのはなぜですか?

私は仮想メソッドと vtables の概念を理解していると思いますが、オブジェクトをポインター (または参照) として渡すことと、値で渡すこと (どのような種類の vtable などを破棄するのか?) に違いがある理由がわかりません。

なぜこのようなものが機能するのですか:

そして、これではありませんか?:

0 投票する
2 に答える
480 参照

c++ - スライスされたオブジェクトへの参照を返す(スーパータイプ)

次のクラスを検討してください。

NamedPointに対応するCoord型の参照を返すNamedPointのメンバー関数(coord())を作成したいと思います。

たとえば、次のようにします。

しかし、私は一時変数についての警告を受け取り、それに夢中ではありません。

もちろん、次の作品は次のとおりです。

しかし、私はむしろ参照を返したいです。

継承されたクラスを使用してこれが可能かどうか誰かが知っていますか?

機能のポイントを説明しなくてすみません。CoordとNamedPointでは異なる方法で==演算子をオーバーロードしています。Coordは単に{x、y}をチェックし、NamedPointは{id、x、y}をチェックします。この==テストの前にNamedPointをCoordにキャストするのを忘れた場合、間違ったバージョンを使用します。

だから、私はそれを認識しながら

私が欲しいものを私に与えるだろう、私はむしろ次のようなものを使用したい

何が起こっているのかについてはもっと明確だと思います。

0 投票する
7 に答える
1537 参照

c++ - 派生オブジェクトのベースオブジェクトを設定しますか?

これは基本的な概念の質問です。Baseから継承するDerivedクラスがあり、新しいDerivedオブジェクトをインスタンス化する場合、そのBaseオブジェクトを選択した特定のBaseオブジェクトに設定して、すべての呼び出しベースクラスメソッドがこの特定のベースオブジェクトにリダイレクトされるようにできますか?

このようなもの:

私のスキルレベルは低いので、その単純なコードであらゆる種類のエラーを犯したと確信していますが、それは単なるアイデアです。

これはC++で可能ですか?派生した情報をオブジェクトから切り取ることができるので、継承のチェーン内のコンポーネントを分離して置き換えることができますか?

なぜ私はこれをしたいのですか?

ミックスインユリを考えてみましょう:(ここでも、構文エラーを許してください)

この場合、ミックスインのベースオブジェクトを任意のオブジェクトに設定できれば、ミックスインがそれについて何も知る必要なしに、ミックスイン内の任意のパラメーターリストでコンストラクターを使用できます。また、ミックスインは、デコレータ間で共通のインターフェイスを必要とせずに、デコレータのように使用できます。

答えてくれてありがとう。オブジェクトの派生部分を切り取ることができるので、ベース情報と派生情報は別々に存在しているように見えます。誰かがこれについてコメントできますか?私がよく耳にするvtablesのようないくつかの内部テーブルにアクセスして(このタイプのものについては何も知らないので、おそらくこれは当てはまらないかもしれません)、これを達成できますか?

@Benoît

1と4だけが機能するのに、2と3は機能しない理由を説明してください。class Base {protected:std :: string name; public:Base(std :: string n){name = n; }

これは印刷されます:

元の1x=5新しい1x= 6

オリジナル2x=5オリジナル2x= 6

オリジナル3x=5オリジナル3x= 6

元の4x=5新しい4x= 6

なぜこれはポインターを使用する場合にのみ機能するのですか?

0 投票する
2 に答える
309 参照

c++ - C ++でのオブジェクトスライスの問題を克服する方法

c++ でのオブジェクトのスライスに関する問題を解決するにはどうすればよいですか?

私のアプリケーションでは、派生オブジェクトclassに動的に割り当てられたポインターがあり、派生classオブジェクトがベースclassオブジェクトに割り当てられている場合、動作はメモリ破損です!

0 投票する
4 に答える
397 参照

c++ - クラススライシングによる未処理の例外

以下の注記行に未処理の例外読み取り位置0x00000008(NULL値の読み取り)があります。エラーに至るまでの関連メソッドが含まれています(以下の例に続く):

イベントメソッド:

KeyEventメソッド:

KeyDownEventメソッド:

イベントハンドラメソッド:

メインループシーケンス:

これがスライスの問題であることはわかっていますが、なぜ発生しているのか、どのように修正すればよいのかわかりません(実際、考えてみると、おそらく「要求されたタイプに変換できません」エラーです)。プログラムをステップスルーするときは_scancode常に適切な値ですが、2番目の行dynamic_cast<KeyboardKeyDownEvent*>(nxtEvent)->GetKey()が実行されるとエラーがスローされます。ダブルキャストもdynamic_cast<KeyboardKeyDownEvent*>(dynamic_cast<KeyboardKeyEvent*>(nxtEvent))->GetKey()同じエラーで失敗します。

編集:

いくつかの調整の後、このバリアントは完全に機能します。