2016-09-16 5 views
0

Я изучаю C++ и читаю книгу, экскурсия по C++.Вектор виртуального класса в C++

В разделе 9.2.1, эта книга говорит

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

Мой вопрос, почему "вектор <Shape> против"; не принимается, и "vector < unique_ptr < Форма > > vups;" лучший? Не могли бы вы прояснить это?

Класс формы - это виртуальный класс. В предыдущей главе класс Circle и Triangle был определен как полученный из Shape. Объект класса Circle и объект класса Triangle предназначены для хранения в контейнере.

ответ

1

Контейнер 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? Мы ничего не можем сделать с этим пространством! Экземпляры производных классов обычно больше, чем экземпляры их базовых классов, поэтому такой вектор снова будет бесполезен для нас.

Смежные вопросы