次のコードを検討してください。
Base b;
if (something)
b = DerivedA();
else
b = DerivedB();
このような場合、「スライス」が発生することはよく知られています。C++ では、基本型の変数に派生型のオブジェクトを割り当てることはできません。オブジェクトは、基本型で定義されていないものから「スライス」されます。(そのようなことをしたい場合は、ポインターまたは参照を使用する必要があります)。
この本当の理由を理解したい。Base
つまり、変数がDerived
オブジェクトをスライスせずに保持できない理由です。
この理由は、Base
オブジェクトとオブジェクトが同じサイズではない可能性があるためであり、オブジェクト全体を変数Derived
に格納できることを保証できないためだと思います。aは 4 バイトを使用する場合がありますが、aは 7 バイトです。そのため、基本型のサイズに合わせて派生オブジェクトを常にスライスすることにしました。Derived
Base
Base
Derived
ポインターはすべて同じ量のメモリを占有するため、ポインターを使用してこれを行うことができます。
この仮定は正しいですか?そうでない場合、スライスの実際の理由は何ですか?