Inheritance C+中虚类的向量+; 我正在学习C++和阅读一本书,一个C++的旅行。p>
在第9.2.1节中,本书说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;”是最好的?你能澄清一
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
派生的类,我们该怎么办呢?我们对这个空间无能为力!派生类的实例通常比它们的基类的实例大,所以这样的向量对我们来说也是无用的