たとえば、
unique_ptr<Derived> = new deriv;
std::vector<unique_ptr<Base>>.push_back(std::move(deriv));
deriv はタイプにスライスされunique_ptr<Base>
ますか?
たとえば、
unique_ptr<Derived> = new deriv;
std::vector<unique_ptr<Base>>.push_back(std::move(deriv));
deriv はタイプにスライスされunique_ptr<Base>
ますか?
スライスは発生しません。オブジェクトへのunique_ptr<Base>
ポインタを所有しDerived
ます。
派生クラスへのは、基本クラスへunique_ptr
の に暗黙的に変換できます。unique_ptr
(あなたの例は現在の編集ではコンパイルされません。あなたの意図が何であったかを推測するだけです)
いいえ、そうではありません。スライシングとは、Derived オブジェクトを Base オブジェクトにコピーすることであり、Derived ポインターを Base ポインターにコピーすることではありません (ここでは、unique_ptr は厄介者です)。
これにより、次のようにスライスされます。
class a { };
class b : public a { };
void foo(a myvar) { };
int main()
{
b myb;
foo(myb);
}
これはしません:
class a { };
class b : public a { };
void foo(a* myvar) { };
int main()
{
b myb;
foo(&myb);
}
発生する可能性のあるスライスは、コンテナの要素タイプで発生します。間接的に含まれるオブジェクトは影響を受けません。