Контейнер vector
владеет каждым объектом в нем, в частности, создавая объект, чтобы стать частью вектора. Поскольку вы не можете построить Shape
, чтобы перейти в вектор, не было бы способа использовать std::vector<Shape>
. Попробуйте вставить объект в этот вектор, это невозможно.
С другой стороны, указатель на экземпляр любого класса, производный от Shape
, может быть преобразован в Shape*
, и вы можете без проблем копировать указатели. Так что это нормально:
vector<Shape*> vps;
vps.insert(new Circle());
Точно так же, unique_ptr
s полиморфны. Таким образом, вы можете построить unique_ptr<Shape>
, который указывает на экземпляр класса, производного от Shape
.
Но вы не можете сделать Shape
, являющийся экземпляром класса, производного от Shape
. Таким образом, vector<Shape>
является не стартером.
Другой способ посмотреть, какое пространство выделит вектор. Для вектора Shape*
он выделяет достаточно места для хранения Shape*
и может содержать указатель на экземпляр класса, производного от Shape
, без проблем.
Для вектора unique_ptr<Shape>
, что будет выделять достаточно места, чтобы провести unique_ptr<Shape>
, и который может содержать уникальный указатель на Shape
, который указывает на класс, производный от Shape
, без проблем.
Но что происходит с vector<Shape>
. Это выделяет достаточно места для хранения Shape
. Но что мы можем сделать с этим, если мы пытаемся сохранить класс, полученный из Shape
? Мы ничего не можем сделать с этим пространством! Экземпляры производных классов обычно больше, чем экземпляры их базовых классов, поэтому такой вектор снова будет бесполезен для нас.