Язык программирования C++ от Страуструпа


.Динамическая информация о типе - часть 2


void f(dialog_box& db)

{

  dbox_w_str* dbws = ptr_cast(dbox_w_str, &db);

  if (dbws) {  // dbox_w_str

     // здесь можно использовать dbox_w_str::get_string()

  }

  else {

     // ``обычный'' dialog_box

  }

  // ...

}

Здесь "операция" приведения ptr_cast() свой второй параметр (указатель) приводит к своему первому параметру (типу) при условии, что указатель настроен на объект тип, которого совпадает с заданным (или является производным классом от заданного типа). Для проверки типа dialog_box используется указатель, чтобы после приведения его можно было сравнить с нулем.

Возможно альтернативное решение с помощью ссылки на dialog_box:

void g(dialog_box& db)

{

  try {

     dbox_w_str& dbws = ref_cast(dialog_box,db);

     // здесь можно использовать dbox_w_str::get_string()

  }

  catch (Bad_cast) {

     // ``обычный'' dialog_box

  }

  // ...

}

Поскольку нет приемлемого представления нулевой ссылки, с которой можно сравнивать, используется особая ситуация, обозначающая ошибку приведения (т.е. случай, когда тип не есть dbox_w_str). Иногда лучше избегать сравнения с результатом приведения.

Различие функций ref_cast() и ptr_cast() служит хорошей иллюстрацией различий между ссылками и указателями: ссылка обязательно ссылается на объект, тогда как указатель может и не ссылаться, поэтому для указателя часто нужна проверка.




- Начало -  - Назад -  - Вперед -