4

たとえば、

unique_ptr<Derived> = new deriv;
std::vector<unique_ptr<Base>>.push_back(std::move(deriv));

deriv はタイプにスライスされunique_ptr<Base>ますか?

4

3 に答える 3

6

スライスは発生しません。オブジェクトへのunique_ptr<Base>ポインタを所有しDerivedます。

派生クラスへのは、基本クラスへunique_ptrの に暗黙的に変換できます。unique_ptr

于 2010-07-22T03:24:29.580 に答える
2

(あなたの例は現在の編集ではコンパイルされません。あなたの意図が何であったかを推測するだけです)

いいえ、そうではありません。スライシングとは、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);
}
于 2010-07-22T03:25:28.940 に答える
1

発生する可能性のあるスライスは、コンテナの要素タイプで発生します。間接的に含まれるオブジェクトは影響を受けません。

于 2010-07-22T03:25:34.340 に答える