虚拟类向量在C ++中

时间:2016-09-16 17:07:41

标签: inheritance virtual

我正在学习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类对象旨在存储在容器中。

1 个答案:

答案 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的类,我们可以做些什么呢?我们可以用这个空间做任何事情!派生类的实例通常比它们的基类的实例大,所以这样的向量对我们来说再次无用。