コンテナは、コンテナ内のすべてのオブジェクトを所有します。具体的には、オブジェクトを構築してベクターの一部になります。ベクターに入るためにShape
を構築することはできないので、std::vector<Shape>
を使用する方法はありません。そのベクトルにオブジェクトを挿入しようとしましたが、できません。
一方、Shape
から派生した任意のクラスのインスタンスへのポインタはShape*
に変換でき、問題なくポインタをコピーできます。だからこれは問題ありません。
vector<Shape*> vps;
vps.insert(new Circle());
同様に、unique_ptr
は多型です。したがってShape
から派生したクラスのインスタンスを指すunique_ptr<Shape>
を構築することができます。
しかし、Shape
から派生したクラスのインスタンスであるShape
を作成する方法はありません。したがって、vector<Shape>
は非スターターです。
これを見るもう1つの方法は、ベクトルがどの空間を割り当てるかを調べることです。 Shape*
のベクトルの場合、Shape*
を格納するのに十分な領域を割り当て、Shape
から派生したクラスのインスタンスへのポインタを保持できますが、問題はありません。 unique_ptr<Shape>
保持するのに十分なスペースを割り当てるunique_ptr<Shape>
のベクトルについて
、それはShape
、問題はないから派生したクラスを指すShape
に固有のポインタを保持することができます。
しかし、vector<Shape>
の場合はどうなりますか?それはShape
を保持するのに十分なスペースを割り当てます。しかし、もし我々がShape
から派生したクラスを保存しようとしているなら、それをどうすればいいでしょうか?私たちはそのスペースで何もできません!派生クラスのインスタンスは通常、基本クラスのインスタンスよりも大きいため、このようなベクトルはやはり私たちにとって役に立たないでしょう。