2016-09-16 3 views
0

私はC++を学習し、本を読むこと、C++のツアーです。セクション9.2.1ではC++での仮想クラスのベクトル

、この本は

vector<Shape> vs;    # is bad, 
vector<Shape*> vps;    # is better, and 
vector<unique_ptr<Shape>> vups; # is OK. 

私の質問は、なぜ "ベクター<形状>対;" であると言います受諾されず、 "ベクトル< unique_ptr <形> > vups;"最高です?あなたはそれを明確にすることができますか?

ここのシェイプクラスは仮想クラスです。前の章では、CircleクラスとTriangleクラスはShapeから派生したものとして定義されていました。サークルクラスオブジェクトとトライアングルクラスオブジェクトは、コンテナに格納されます。

答えて

1

コンテナは、コンテナ内のすべてのオブジェクトを所有します。具体的には、オブジェクトを構築してベクターの一部になります。ベクターに入るために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から派生したクラスを保存しようとしているなら、それをどうすればいいでしょうか?私たちはそのスペースで何もできません!派生クラスのインスタンスは通常、基本クラスのインスタンスよりも大きいため、このようなベクトルはやはり私たちにとって役に立たないでしょう。

関連する問題