我正在学习C ++并阅读一本书,参观C ++。
在9.2.1节中,本书说
vector<Shape> vs; # is bad,
vector<Shape*> vps; # is better, and
vector<unique_ptr<Shape>> vups; # is OK.
我的问题是为什么&#34; vector&lt; Shape&gt; VS;&#34;不接受,&#34; vector&lt; unique_ptr&lt; Shape&gt;&gt; vups;&#34;是最好的?你能澄清一下吗?
这里的Shape类是一个虚拟类。在前一章中,Circle类和Triangle类已定义为派生自Shape。 Circle类对象和Triangle类对象旨在存储在容器中。
答案 0 :(得分:2)
vector
容器拥有其中的每个对象,特别是构造对象以成为向量的一部分。由于您无法构建Shape
进入向量,因此无法使用std::vector<Shape>
。尝试将对象插入到该向量中,无法完成。
另一方面,指向从Shape
派生的任何类的实例的指针可以转换为Shape*
,并且可以毫无问题地复制指针。所以这很好:
vector<Shape*> vps;
vps.insert(new Circle());
同样,unique_ptr
是多态的。因此,您可以构造一个unique_ptr<Shape>
,指向从Shape
派生的类的实例。
但是你无法创建Shape
,它是从Shape
派生的类的实例。所以vector<Shape>
不是首发。
另一种看待它的方法是查看矢量将分配的空间。对于Shape*
的向量,它将分配足够的空间来容纳Shape*
,并且可以保存指向从Shape
派生的类的实例的指针,没问题。
对于unique_ptr<Shape>
的向量,它将分配足够的空间来容纳unique_ptr<Shape>
,并且可以保存指向Shape
的唯一指针,该指针指向从{{Shape
派生的类1}},没问题。
但vector<Shape>
会发生什么。这会分配足够的空间来容纳Shape
。但是如果我们试图存储一个派生自Shape
的类,我们可以做些什么呢?我们可以用这个空间做任何事情!派生类的实例通常比它们的基类的实例大,所以这样的向量对我们来说再次无用。