9

タイトルはほとんどそれをすべて言います。基本的に、これを行うことは合法ですか?

class Base {
    //stuff
}

class Derived: public Base {
    //more stuff
}

vector<Base> foo;
Derived bar;
foo.push_back(bar);

私が見た他の投稿に基づくと、以下は問題ありませんが、スレッドセーフにするのが難しいため、この場合はポインターを使用したくありません。

vector<Base*> foo;
Derived* bar = new Derived;
foo.push_back(bar);
4

3 に答える 3

15

いいえ、Derivedオブジェクトはスライスされます。追加のメンバーはすべて破棄されます。

生のポインターの代わりに、を使用しますstd::vector<std::unique_ptr<Base> >

于 2012-08-09T17:55:45.070 に答える
4

それは合法ですが、オブジェクトのスライスに悩まされています。基本的に、オブジェクトのベクトルがありBaseます。ポリモーフィズムはなく、派生オブジェクトの型情報は失われます...それはまるでBaseオブジェクトをベクトルに追加するかのようです。

代わりにスマートポインタを使用できます。

于 2012-08-09T17:54:54.890 に答える
1
vector<Base> foo;
Derived bar;
foo.push_back(bar);

push_backは次のように宣言されているため、これは Base オブジェクトをプッシュすることと同じです。

void push_back ( const T& x );

したがって、コンパイラは暗黙的なダウングレード変換を行い、ベクトル メモリ プールにコピーします。いいえ、Derived中に入れることはできませんvector<Base>。彼らはなるでしょうBase

仮想関数を追加しBaseて でオーバーライドしDerived、オブジェクトを作成し、Derivedそれをプッシュしてからベクトルの新しいオブジェクトから呼び出すと、実装が呼び出されるvector<Base>ことがわかりますBase

于 2012-08-09T18:06:04.267 に答える