Я полагаю, вы используете boost::shared_ptr
... Я думаю, вы хотите dynamic_pointer_cast
или shared_polymorphic_downcast
.
Однако для этого требуются полиморфные типы.
что это за тип Base* const
? const Base*
Я понимаю, но Base* const
? Что означает const
в этом случае?
const Base *
является изменяемым указателем на константу Base
.
Base const *
является изменяемым указателем на константу Base
.
Base * const
- это постоянный указатель на изменяемый Base
.
Base const * const
- постоянный указатель на постоянную Base
.
Вот минимальный пример:
struct Base { virtual ~Base() { } }; // dynamic casts require polymorphic types
struct Derived : public Base { };
boost::shared_ptr<Base> base(new Base());
boost::shared_ptr<Derived> derived;
derived = boost::static_pointer_cast<Derived>(base);
derived = boost::dynamic_pointer_cast<Derived>(base);
derived = boost::shared_polymorphic_downcast<Derived>(base);
Я не уверен, было ли это намеренно, что ваш пример создает экземпляр базового типа и приводит его к приведению, но он служит для хорошей иллюстрации разницы.
static_pointer_cast
"просто сделает это". Это приведет к неопределенному поведению (Derived*
, указывающему на память, выделенную и инициализированную Base
) и, скорее всего, приведет к сбою или, что еще хуже. Счетчик ссылок на base
будет увеличен.
dynamic_pointer_cast
приведет к нулевому указателю. Счетчик ссылок на base
не изменится.
shared_polymorphic_downcast
будет иметь тот же результат, что и статическое приведение, но вызовет утверждение, скорее всего, будет успешным и приведет к неопределенному поведению. Счетчик ссылок на base
будет увеличен.
См. (неработающая ссылка) :
Иногда бывает немного трудно решить, использовать ли static_cast
или dynamic_cast
, и вы хотели бы иметь немного обоих миров. Хорошо известно, что dynamic_cast имеет накладные расходы времени выполнения, но он безопаснее, тогда как static_cast вообще не имеет никаких издержек, но может молча завершиться сбоем. Как было бы хорошо, если бы вы могли использовать shared_dynamic_cast
в отладочных сборках и shared_static_cast
в сборках релизов. Ну, такая вещь уже доступна и называется shared_polymorphic_downcast
.