問題タブ [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++ - 仮想関数の戻り値の型のオーバーライドは異なり、共変ではありません
あ、SOがジャストインタイムで帰ってきました。
奇妙なエラーが発生します:
問題の原因となっているコードは次のとおりです。
エラーを調べたところ、Microsoft の Web サイトで見つけたページによると、型が共変になる方法の 1 つは次の場合です。
B::f の戻り値の型のクラスが D::f の戻り値の型のクラスと同じクラスであるか、D::f の戻り値の型のクラスの明白な直接または間接の基本クラスであり、かつDでアクセス可能
と の場合はそうではInner
ありませInner2
んか?問題があれば、Microsoft Visual C++ 2010 を使用しています。
OK、ジョンのおかげで、ポインタと参照だけが共変であることを学びました。何故ですか?Derived は Base にキャストできるので、同じものから派生した戻り値の型を持つ仮想関数は、戻り値の型を基底クラスの型にキャストしないのはなぜですか? 私の例では、実際にはキャストされたan を(A*(new B))->blah()
返すことが理にかなっているように思えます。Inner
Inner2
c++ - C++ 継承 - サブクラスのコンストラクタ呼び出し?
私は主に次のものを持っています:
そして、私のクラスは次のとおりです。
コンパイルすると、次のエラーが発生します。
「Sum::Sum(Identifier, Identifier)」の呼び出しに一致する関数がありません
候補は次のとおりです: Sum::Sum(Expression&, Expression&)
Identifier クラスは Expression から継承しているのに、なぜこのエラーが発生するのですか?
c++ - 隠しスライシング コピー コンストラクターとは
この質問は、この質問とコメントによるものです。
この例:
このようにg ++ 4.6.1を使用してコンパイルすると:
次の出力を生成します:
出力はA catch
です。
スライスの問題が原因で最初の catch ブロックがトリガーされたことを理解しています。
- 基本クラスの隠しコピー コンストラクターについてはどこに記載されていますか?
- この振る舞いについてどこに書かれていますか?
PS1 規格から引用して回答を提供してください。
PS2そして、例外はconst参照で処理する必要があることを認識しています。
c++ - なぜ`e.what()`は「不正な割り当て」を出力するのですか?
ブロック内のnew
式は、私のコンピューターで例外をtry
スローします。bad_alloc
catch句は、参照ではなく値で例外オブジェクトを受け取ることに注意してください。どうしてe.what()
プリントするの"bad allocation"
?スライスされると思いました。
c++ - 派生クラス オブジェクトを基底クラス変数に格納する
複数のクラスのインスタンスをベクトルに格納したいと考えています。すべてのクラスが同じ基本クラスから継承するため、これは可能です。
このプログラムを想像してください:
「identify」メソッドは仮想であるため、「DERIVED」と出力されると予想していました。代わりに、「vect[0]」は「ベース」インスタンスのようで、出力されます
ベース
これを行うことができる独自のコンテナ(おそらくベクトルから派生)を何らかの方法で作成できると思います(おそらくポインタのみを保持しています...)。これを行うためのよりC ++っぽい方法があるかどうかを尋ねたかっただけです。そして、私は完全にベクトル互換になりたいです (他のユーザーが私のコードを使用する場合の便宜のため)。
c++ - 著者が話している望ましくない結果とは何ですか?
この例は、Bruce Eckel の "Thinking in C++" の第 14 章、「アップキャストとコピー コンストラクター」から引用したものです。
著者は、このコードに関して次のコメントを作成します。
「子の operator<< は、その中の親部分の operator<< を呼び出す方法のために興味深いものです: Child オブジェクトを Parent& にキャストすることによって (参照の代わりに基本クラスオブジェクトにキャストする場合)通常、望ましくない結果が得られます):
上記の命令を次のように置き換えて、プログラムも実行します。
プロプラムは問題なく実行されますが、予想される違いは 1 つだけです。ここで、Parent
コピー コンストラクターが再度呼び出されて、引数c
がにコピーされますParent::operator<<()
。
では、著者が話している望ましくない結果とは何でしょうか?
c++ - オブジェクト (ポインターではなく) を既知の派生型にダウンキャストしても安全ですか?
スライスの危険性はありますか
どこ
とobj1
とはオブジェクトobj2
であることが保証されていBlock
ますか?
私は使いたくなる:
しかし、SO の object-slicing タグの簡単な説明を読むと、前者を使用したくなります。しかし、厄介なサイレントスライスは本当に望んでいません。
c++ - 関数内の抽象クラスポインタにサブクラスを割り当てる方法は?
関数を呼び出した後、実際のボード参照を新しいボードと等しくしようとしています。Boardは抽象クラスであり、get_board()はBoardへのポインターを返しますが、実際には、追加の属性を持つboardのサブクラスです。ただし、move関数が呼び出された後、ボードはmoveの呼び出し前と同じボードになります。実際の値を変更しながら、抽象スーパークラスへのポインターにサブクラスを割り当てることは可能ですか?スライスの問題が発生しているようです。
c++ - Will this result in object slicing?
Say I have an array of pointers to an abstract class:
And I have two classes that extend Piece
called King
and Queen
. I assign a King
to a spot in pieces
and Queen
to another spot:
If I haven't overloaded the assignment operator, does slicing occur? Or does pieces[0]
is an instance of King
and pieces[1]
is an instance of Queen
? What is going on in that array (if this was C++)?
EDIT: See a full example of the code in question here.
c# - C# と C++ - 型、継承、および vtable
C++ と C# のこの違いの原因を理解するのに苦労しています。
まず、基本クラスに仮想関数が含まれている例があります。
これの出力は、予想どおり、「派生」です。
f() を削除すると、これは機能しなくなります。出力は「ベース」です。例:
これについての私の理解は、仮想関数を持つと、コンパイラーが vtable を指すオブジェクトに vptr を追加するということです。vtable には、呼び出す正しい関数のアドレスが含まれています (Derived::f()) - (オブジェクトの型情報と同様に?)
興味深い部分 - C# との比較。ここで、"Base" と "Derived" は、2 番目の C++ の例と同様に、基本的に空のクラスです。
したがって、私の質問は次のとおりです。C++ 部分の私の理解は正しいですか? C++ が正しくない場合、C# はどのようにしてオブジェクトの型を正しく識別することができますか?