C++相談室 part44
■ このスレッドは過去ログ倉庫に格納されています
0350デフォルトの名無しさん
2005/10/24(月) 12:21:07struct Base { int val1; virtual ~Base(){} };
struct Derived : public Base { int val2; };
※sizeof(Base) == 8、sizeof(Derived) == 12 とする
Base * p = new Derived[5];
++p;
上記がスライシング。
++p だと、p から 8Byte しか進まないので、
p が指している場所は、次の Derived ではなく、
Derived の中途半端な位置を指していることになる。
std::vector< Base > vec(5) に対して、
vec.push_back( vec.begin() + 1, Derived() );
をやると、Derived の Base 部分しかコピーされないので、
これもスライシングの一種。
std::vector< Base * > vec2(4); に対して、
vec2.insert( vec2.begin()+1, new Derived() ); とするのは安全。
■ このスレッドは過去ログ倉庫に格納されています