Давайте посмотрим на ваш код:
vector<A> v;
v.push_back(B());
v.push_back(C());
Здесь push_back
принимает аргумент типа A&&
и перемещает его, используя конструктор перемещения A
, для создания нового элемента вектор. Итак, ваш код:
- Создает вектор
A
s - Создает экземпляр
B
, затем вызывает конструктор перемещения A
для этого экземпляра B
для создания экземпляра A
(который не является экземпляром B
) в векторе - То же самое для
C
вместо B
Если вы хотите использовать динамическую диспетчеризацию c, вам нужно хранить указатели на ваши элементы в векторе. Выделите объекты в куче и сохраните для них маркеры, используя std::unique_ptr
, что освободит память в его деструкторе.
// for std::unique_ptr, available since C++11, and std::make_unique, available since C++14
#include <memory>
// ...
std::vector<std::unique_ptr<A>> v;
v.push_back(std::make_unique<B>());
v.push_back(std::make_unique<C>());
Теперь, когда вектор использует std::unique_ptr
, вам нужно использовать &
при зацикливании вектора:
for(auto& x : v) {
std::cout << x->print() << std::endl;
}
auto
не будет автоматически ставить ссылку. Если вы просто используете auto
, то каждый элемент вектора будет скопирован в x
, но поскольку конструктор копирования std::unique_ptr
удален, код не будет компилироваться.