問題タブ [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 投票する
1 に答える
91 参照

c++ - 非ルート基底クラスをスライスすると正しい答えが得られるのはなぜですか?

オブジェクトのスライスを使用したいコードのケースがありますが、それが安全か賢明かを判断しようとしています。これを判断するために、次の例を実行しました。

基本クラスが最上位 (ルート) ではないため、1 が返されることを期待していましたが、3 が表示されます。クラスのいずれかに仮想テーブルがある場合、あなたの答えはどのように変わりますか? 安全だと思わない場合、派生オブジェクトから非ルート ベース オブジェクトをコピーするための回避策はありますか?

次のコマンドを使用して、gcc 4.6.3 の Linux でこれを実行しました。

0 投票する
1 に答える
264 参照

c++ - auto x = f() は T x = f() より優れているか?

別のトピックでは、誰かが使用を提案しました

それ以外の

(の署名が の場合f) T f()f彼らは、これにより、誰かがたまたま に変更されたU f()場合にサイレント オブジェクト スライスが防止されると指摘しましUT

それは私には理にかなっていますが、私が見逃していることが他にもあるかもしれません。では、どちらが優れており、その理由は何ですか?

0 投票する
1 に答える
332 参照

c++ - プライベート継承でのオブジェクトのスライス

プライベート継承でオブジェクトのスライスが行われないのはなぜですか? そのような場合に Static_cast はエラーになりますか? private 継承は、その継承クラス間に「is - a」関係を保持しないことを理解しています。派生はベース型ではないため、コンパイラは暗黙的な変換を行わないように強制しているため、これはスライシングと関係がありますか?

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

c++ - constructors calling subclass

I have a (partally implemented) class hierarchy where

Now in the rest of my code I would like to be able to abstract from whether something is a jpeg image or even an image, so I would like to work with data. But at the same time I would like to pass commands specific to jpeg images to those functions.

So if I call data<int> img("lena.jpg"); which turns out to be an image, even a jpeg image, I would like the data constructor to call the image constructor, which in turn calls the jpgimage constructor.

There is no way I can get it to work, and people warn about slicing, virtual constructors, etc. But is this such a strange way to set it up?

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

c++ - 仮想メソッドをコピー可能な型に配置することは良い考えですか?

関連する質問をいくつか見ましたが、これとまったく同じではありません...

クラスはいくつかの主要なカテゴリに当てはまるものとして扱ってきましたが、簡単にするために次の 4 つとしましょう。

  • いくつかのデータと一連の操作を持つ値クラス。それらはコピーされ、同等かどうか意味のある比較ができます (コピーは を介し​​て同等であると予想されます==)。 これらにはほとんどの場合、仮想メソッドがありません。

  • 割り当てとコピーを無効にする ID を持つインスタンスを持つ一意のクラス。operator==オブジェクトとしてではなくポインターとして比較するため 、通常、これらにはありません。ポインターまたは参照によってそれらを渡すことを余儀なくされているため、のリスクがないため、これらには非常に多くの仮想メソッドがあります。

  • Unique-but-Clonable Classesコピーを無効にしますが、それが本当に必要な場合はクローン作成をサポートするように事前に設計されています。 これらには仮想メソッドがあり、最も重要なのは、仮想構築/クローニングイディオムに従うものです

  • 保持しているもののプロパティを継承する コンテナ クラス。これらには仮想メソッドがない傾向があります...たとえば、「STL コンテナーに仮想デストラクタがないのはなぜですか?」を参照してください。.

この非公式な信念体系を保持しているにもかかわらず、私は何度か、コピー可能なものに仮想メソッドを追加しようとしました。「これができたらカッコイイ」と思っていたのに、どうしても壊れてしまう。

これにより、仮想メソッドを持ち、コピーを無効にしない型の実際の良い例を誰かが持っているのではないかと思いました。