Downcasting shared_ptr <Основа> к <Полученному> shared_ptr?

Столкнулся с этим сегодня:

/// <summary>
/// The Page_Load runs when the page loads
/// </summary>
private void Page_Load(Object sender, EventArgs e) {}
90
задан Lajos Nagy 31 August 2009 в 17:39
поделиться

1 ответ

Полагаю, вы используете 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);

I ' m не уверен, было ли это намеренно, что ваш пример создает экземпляр базового типа и приводит его, но он служит для хорошей иллюстрации разницы.

static_pointer_cast будет «просто делать это». Это приведет к неопределенному поведению ( Derived * , указывающему на память, выделенную и инициализированную Base ) и, вероятно, вызовет сбой или что-то еще хуже. Счетчик ссылок на базе будет увеличиваться.

dynamic_pointer_cast приведет к нулевому указателю. Счетчик ссылок на base не изменится.

shared_polymorphic_downcast будет иметь тот же результат, что и статическое приведение, но вызовет утверждение, которое, скорее, будет успешным и приведет к неопределенному поведение. Счетчик ссылок на базе будет увеличиваться.

См. (мертвая ссылка) :

Иногда немного сложно решить, использовать ли static_cast ] или dynamic_cast , и вы хотели бы иметь немного обоих миров. Хорошо известно, что у dynamic_cast накладные расходы времени выполнения, но это безопаснее, тогда как static_cast вообще не имеет накладных расходов, но может молча выйти из строя. Как было бы хорошо, если бы вы могли использовать shared_dynamic_cast в отладочных сборках и shared_static_cast в сборках выпуска. Что ж, такая штука уже доступна и называется shared_polymorphic_downcast .

46
ответ дан 24 November 2019 в 07:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: