Это правда, что срезы объектов не применяются к указателям
Указатели - это POD (только для записи: shared_ptr
s - нет).
Цитаты вопроса:
shared_ptr может быть неявно преобразован в shared_ptr всякий раз, когда T * может быть неявно преобразован в U *.
Речь идет о преобразовании из одного типа в другой, который отличается от выгрузки,Нет никаких отношений наследования между shared_ptr<A>
и shared_ptr<B>
, независимо от того, является ли A
производным от B
или наоборот.Это причина того, что сам объект shared_ptr
не разрезает.
Неверно, что разделение объектов не может быть проблемой
Рассмотрим иерархию классов A, B без виртуальных деструкторов.
std::shared_ptr<A> a(new B);
auto a = std::make_shared<B>();
захватит де-локатор B, а затем при необходимости вызовет деструктор B.
std::shared_ptr<A> a((A*)(new B));
не сделает ничего подобного и вызовет проблемы с нарезкой в указанном объекте.
Неправда, что ничего не изменилось из-за того, что использование указателя заключено в умный указатель
Например, использование unique_ptr
имеет другое поведение:
std::unique_ptr<A> a(new B);
std::unique_ptr<A> a((A*)(new B));
*У 1034 * будут проблемы с нарезкой, а у
auto a = std::make_unique<B>();
нет.
Использование простого указателя также не поможет:
A* a = new B{};
delete a;
- рецептдля бедствия.
Пример кода доступен здесь .