shared_ptr
имеет неявный конструктор downcast, поэтому вы можете написать
vec.push_back(shared_ptr<KlasaB>(new KlasaB));
Обратите внимание, что тип shared_ptr
равен shared_ptr<KlasaB>
, а vec ожидает shared_ptr<KlasaA>
.
.Имейте в виду, вы можете заменить конструктор shared_ptr
на вызов функции make_shared
(который в любом случае может быть предпочтительным).
vec.push_back(make_shared<KlasaB>());
Это избавит вас от необходимости набирать кучу имен классов.make_shared
принимает аргументы, которые он передает, поэтому make_shared<X>
является хорошей заменой для new X
.
Вы можете заметить, что здесь есть потенциальные последствия для производительности: структура данных make_shared
может (будет?), и есть дополнительное неявное преобразование, но оно может быть оптимизировано компилятором.Профиль и проверка.