問題タブ [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++ - スタックオブジェクトの動的キャストが失敗する
先日、基本型へのポインターを取得する関数があり、それを派生型にアップキャストしていくつかの追加機能にアクセスする必要があるインスタンスに遭遇しました。しかし、dynamic_cast
失敗しました。私のタイプは間違いなく基本タイプを継承しているため、これは奇妙なことでした。
何が起こっているのかを理解するために、私は次のテストプログラムを作成しました。これは、私が見たものを複製していると思います。
これは興味深いことです。なぜなら、私が呼び出したメソッドだけが提示された場合、cast()
渡されたオブジェクトをキャストできると期待できるからです。そうではないことを示しました。オブジェクトが最初に作成された方法によって異なります。紛らわしいのは、値ではなく参照によって再割り当てされたオブジェクトをキャストできる理由です。さらに、static_cast
タイプに互換性があることが保証されている限り、作業を使用しますか?
c++ - 複数のタイプのオブジェクトのコレクション
複数のタイプのオブジェクトのコレクションを持つためのひどくない方法はありますか? 共通のベースから各タイプを導き出すことができて、私は完全に満足しています。コレクションをコピーしたり、割り当てたりできるように、適切なセマンティクスが必要です。
明らかに、基本クラスのベクトルまたはリストを使用することはできません。オブジェクトはスライスされ、コピーはまったく機能しません。ベクトルやポインターのリスト、またはスマート ポインターの使用は機能しますが、適切なコピー セマンティクスは得られません。
正常なコピー セマンティクスを取得するには、Boost のようなものを使用する必要がありますptr_vector
。しかし、これには、面倒でエラーが発生しやすいインフラストラクチャが必要です。基本的に、基本クラスから新しいクラスを派生させることはできません。これは、それがコレクションに入ると、適切にコピーされないためです。
これは非常に一般的なことのように思えますが、私が知っている解決策はすべてひどいものです。C++ には、特定のインスタンスと同一のオブジェクトの新しいインスタンスを作成する方法が根本的に欠けているようです-その型にコピーコンストラクターがある場合でも。clone
orduplicate
関数を作成するには、すべての派生クラスで慎重にオーバーロードする必要があります。ベースから派生した新しいクラス (またはそのベースから派生した他のクラス) を作成するときにそれを怠ると、コレクションが壊れます。
本当に良い方法はありませんか?
c++ - スライスしても static_cast が null ポインタで機能するのはなぜですか?
多重継承を使用すると、スライスによって親オブジェクトへのアドレスが葉オブジェクトへのアドレスとは異なります。
したがって、Z
オブジェクトがある場合z
、そのアドレス&z
は親のアドレスと一致しません。は より 4 バイト高くなります。Y
static_cast<Y*>(&z)
&z
良い点static_cast
は、それが静的であるため、ランタイムを占有しないことです(dynamic_cast
つまり、 と比較して)。ただし、Z*
を指すがある場合0
、親へのすべてのキャストは null ポインターも生成する必要があります。なぜこれが機能し、どのように実装されるのですか? それは、すべての単一static_cast
が分岐命令を導入することを意味しますか?
c++ - c ++:ベクトル にはDerived型のオブジェクトを含めることができますか?
タイトルはほとんどそれをすべて言います。基本的に、これを行うことは合法ですか?
私が見た他の投稿に基づくと、以下は問題ありませんが、スレッドセーフにするのが難しいため、この場合はポインターを使用したくありません。
c++ - C++ スライスの潜在的な回避策は?
C++ スライスの問題があります。私はC++を初めて使用するので、これができないことに気付くには愚かすぎるかもしれません....さまざまな回避策を試しましたが、現在の最善のアプローチは次のようになります。(非常に大規模なレガシー コード ベースで大量のインターフェイスを変更することを避けるために、このようなことを行う必要があります。これがエレガントなスタイルであるとは決して主張しません!!)
これをコンパイルするのに問題があります。アイデアは正しいですか?それとも、アプローチ全体が失敗する運命にあるのでしょうか? 参照のコンストラクターが問題のようです。私は Stroustrup の "C++ Programming Lanugage" (または少なくとも関連するセクションだと思っていたもの) を読みましたが、役に立ちませんでした。
_realFoo(&_foo)
コンパイラは私の行を好きではありません。_foo
への参照を、クラスのメンバー変数からの参照にしたいのですが。それはC++では不可能ですか?
VS2005 からの特定のエラーは次のとおりです。
c++ - リーク/未定義動作/クラッシュを引き起こすC++スライス
未定義の動作、メモリリーク、またはその他の正しいコードセットでのクラッシュを引き起こす可能性のあるC ++オブジェクトスライス効果の例はありますか?たとえば、クラスA
とB
(から継承されたA
)は正しくて健全であるが、明らかに呼び出すvoid f(A a)
と厄介なことが発生します。
テスト問題を作成するために必要です。目標は、参加者がスライス現象を認識しているかどうかを知ることです。その正しさは意見の問題であってはならないサンプルコードスニペットを使用します。
c++ - Deconstructorからのデバッグアサーションが失敗しましたBLOCK_TYPE_IS_VALID(pHead-> nblockuse)
私は今かなり迷っています。ベクトルクラスを作成しました。最後まで、すべてが私が望むように機能します。デストラクタが呼び出されると、エラーメッセージが表示されます。デバッグアサーションが失敗しましたBLOCK_TYPE_IS_VALID(pHead-> nblockuse)。SOでこのような質問をたくさん見ましたが、試したことがうまくいきませんでした。
.hの一部
c++ - 子のメソッドを呼び出すにはどうすればよいですか: virtual キーワードが機能しませんか?
以下は私のコードです、
コードを実行すると、基本クラスのメソッド('test')が呼び出されます。しかし、メソッドを仮想関数として指定したので、子のメソッドが呼び出されることを期待しています。
では、どうすれば子クラスのメソッドを呼び出すことができますか? ありがとうございました。
c++ - 同じクラスのオブジェクト間でのみ operator= の使用を許可しますか?
クラス階層があり、これを禁止したい:
はFoo
のスーパークラスですBar
。Bar
これを行うと、オブジェクトの一部がスライスされます。プライベートにすることでこれを解決できることは知っていますがoperator=
、型が異なる場合にのみ代入演算子の使用を禁止することは可能ですか?
非公開にするのと同じoperator=
ですが、これを許可します:
サブクラスも作成されると仮定Bar
します。