C++中虚拟class的向量

Vector of virtual class in C++

我正在学习 C++ 并正在阅读一本书,C++ 之旅。

在第 9.2.1 节中,这本书说

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

我的问题是为什么"vector<Shape> vs;"不被接受,而"vector<unique_ptr<Shape>> vups;"最好?你能澄清一下吗?

形class这里是虚class。在上一章中,Circle class 和 Triangle class 被定义为派生自 Shape。圆形 class 对象和三角形 class 对象旨在存储在容器中。

vector容器拥有其中的每一个对象,专门构建对象成为向量的一部分。由于您无法构造一个 Shape 进入向量,因此无法使用 std::vector<Shape>。尝试将对象插入该向量,无法完成。

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

vector<Shape*> vps;
vps.insert(new Circle());

同样,unique_ptrs 是多态的。所以你可以构造一个 unique_ptr<Shape> 指向一个从 Shape.

派生的 class 的实例

但是您无法创建一个 Shape,它是从 Shape 派生的 class 的一个实例。所以 vector<Shape> 是一个非首发。

查看它的另一种方法是查看向量将分配的内容 space。对于 Shape* 的向量,它将分配足够的 space 来容纳 Shape*,并且可以容纳指向从 [=12= 派生的 class 的实例的指针], 没问题。

对于 unique_ptr<Shape> 的向量,它将分配足够的 space 来容纳 unique_ptr<Shape>,并且可以容纳指向 Shape 的唯一指针class 来自 Shape,没问题。

但是 vector<Shape> 会发生什么。这分配了足够的 space 来容纳 Shape。但是,如果我们试图存储从 Shape 派生的 class,我们能用它做什么?我们对此无能为力 space!派生 classes 的实例通常大于其基础 classes 的实例,因此这样的向量对我们来说又是无用的。