Inheritance C+中虚类的向量+; 我正在学习C++和阅读一本书,一个C++的旅行。p>

Inheritance C+中虚类的向量+; 我正在学习C++和阅读一本书,一个C++的旅行。p>,inheritance,virtual,Inheritance,Virtual,在第9.2.1节中,本书说 vector<Shape> vs; # is bad, vector<Shape*> vps; # is better, and vector<unique_ptr<Shape>> vups; # is OK. 向量vs;#不好,, 向量vps;#更好,而且 向量vups;#可以。 我的问题是为什么“矢量vs;”不被接受,而“矢量vups;”是最好的?你能澄清一

在第9.2.1节中,本书说

vector<Shape> vs;               # is bad, 
vector<Shape*> vps;             # is better, and
vector<unique_ptr<Shape>> vups; # is OK. 
向量vs;#不好,, 向量vps;#更好,而且 向量vups;#可以。 我的问题是为什么“矢量vs;”不被接受,而“矢量vups;”是最好的?你能澄清一下吗


Shape类在这里是一个虚拟类。在上一章中,圆类和三角形类被定义为从形状派生的。圆形类对象和三角形类对象要存储在容器中

向量容器拥有其中的每个对象,特别是将对象构造为向量的一部分。由于无法构造
形状
进入向量,因此无法使用
std::vector
。尝试将一个对象插入到该向量中,这是无法完成的

另一方面,指向从
Shape
派生的任何类的实例的指针可以转换为
Shape*
,并且可以毫无问题地复制指针。所以这很好:

vector<Shape*> vps;
vps.insert(new Circle());
vectorvps;
插入(新圆圈());
类似地,
unique\u ptr
s也是多态的。因此,您可以构造一个
唯一的\u ptr
,指向从
Shape
派生的类的实例

但是您无法创建一个
形状
,它是从
形状
派生的类的实例。因此
vector
是一个非启动程序

另一种方法是查看向量将分配什么空间。对于
Shape*
的向量,它将分配足够的空间来容纳
Shape*
,并且可以容纳指向从
Shape
派生的类实例的指针,这没有问题

对于
unique\u ptr
的向量,它将分配足够的空间来容纳
unique\u ptr
,并且可以容纳指向从
Shape
派生的类的
Shape
的唯一指针,没有问题

但是
vector
会发生什么呢。它分配了足够的空间来容纳
形状
。但是,如果我们试图存储一个从
Shape
派生的类,我们该怎么办呢?我们对这个空间无能为力!派生类的实例通常比它们的基类的实例大,所以这样的向量对我们来说也是无用的