0

警告: これはWhat is object slicing?の複製ではありません。、私はすでにそれを読みましたが、私の問題を明確にしません


私の質問は、コピー コンストラクターの欠如が、オブジェクトのスライスに関する基本クラスで問題になるのはなぜですか? 私が何かをするなら

Base base;
Derived derived;

Base newbaseobj((Base)derived);

これはそもそも古典的なスライスの問題です! Base でユーザー定義のコピー コンストラクターを定義することが役立つ理由や方法がわかりません

編集:これらの回答: https://stackoverflow.com/a/26040064/1938163およびhttps://stackoverflow.com/a/26040050/1938163は、コピーコンストラクターを定義/デフォルト設定する必要があることを暗示しているように見えるため、これを求めていますオブジェクトのスライスに対処する

4

3 に答える 3

3

私の質問は、コピー コンストラクターの欠如が、オブジェクトのスライスに関する基本クラスで問題になるのはなぜですか?

それはあなたが「の欠如」の意味に依存します。

本当にコピー コンストラクターが存在しない場合、問題はありません。基底クラスをコピーできないため、スライスは発生しません。

単に宣言していない場合、問題が発生する可能性があります。その場合、1 つは暗黙的に生成され、派生クラス オブジェクトをスライスするために使用できます。

Base でユーザー定義のコピー コンストラクターを定義することが役立つ理由や方法がわかりません

削除すると、コピーが防止され、スライスが完全に防止されます。宣言するprotectedと、基本クラスを派生オブジェクトの一部としてのみコピーできるようになり (派生クラスのメンバー内を除く)、スライスのほとんどのケースを防ぐことができます。

于 2014-09-25T15:16:13.323 に答える
2

オブジェクトのスライスに関する基本クラスでコピー コンストラクターの欠如が問題になるのはなぜですか

一般的にはそうではありません。

ユーザー定義のコピーコンストラクターは、アクセスできないことでスライスを防ぐのに役立ち、コピーの初期化を防ぎます (完全なアーマーでは、コピーの割り当ても担当する必要があります)、または (これを行わないでください) 多相型の場合、スライスを動的に検出できます。 、その場合は一般的なコピーを許可します。

ただし、アクセス可能な通常のコピー コンストラクターはスライスを妨げません。せいぜい、デバッグでコピー操作を検出するのに役立ちます。

于 2014-09-25T15:11:05.253 に答える
1

オブジェクトのスライスは、継承 (具体的にはポリモフィズム) が設計に関係している場合に役立ちます。基本クラスオブジェクトを期待している関数に派生クラスオブジェクトを値で渡すと、スライスが行われます。独自にコピー コンストラクターを定義するか、コンパイラで生成されたスライシングを使用するかに関係なく、何らかの方法で行われます。

ポインターはスライシングの問題を解決する 1 つの方法であり、この場合、派生物をベースに渡してもスライシングの問題は発生せず (ポリモーフィズムが関与していると仮定)、ポインターが関与するため、クラスのコピー コンストラクターへの呼び出しはありません。

質問に答えていただければ幸いです...

于 2014-09-25T15:10:58.553 に答える