Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > безопасное преобразование типов


Автор: Jcs 22.1.2004, 08:36
В каких случаях dynamic_cast генерит исключения? Может быть, кроме наличия виртуальных функций есть еще какие необходимые требования?
Код

class A{
int mem;
public:
A(){}
A& operator=(A& rsm){return *this;}
~A(){};
virtual g(){return 0;}
};
class AA:public A
{
public:
AA& operator=(AA& rsm){return *this;}
virtual g(){return 1;}
};

int main(int argc, char* argv[])
{
A ex0;
AA ex1;

A& rex0 = ex0;
ex0 = ex1;

                AA& rex1 = dynamic_cast<AA&>(rex0);  // генерится исключение
return 0;
}

Автор: Jcs 22.1.2004, 10:19
Все нормально работает, просто забыл поддержку rtti включить

Автор: Jcs 22.1.2004, 12:29
Опять ошибся... Щас генерится bad_cast, в прошлом случае было "non rtti-types" или чего-то в этом роде. Если же ссылки заменить на указатели, то никаких исключений не генерится. Может быть для ссылок и указателей используетс я разная семантика?

Автор: Waters 27.1.2004, 20:22
Цитата
Может быть для ссылок и указателей используетс я разная семантика?

Да, в случае ссылок dynamic_cast сам проверяет результат преобразования и в случае неудачи выбрасывает исключение bad_cast. Оно и понятно - ведь ссылка не может быть невалидной. В случае каста к указателю этого нет.
Если интересуют подробности - глава 15.4.1.1 (это по специальному изданию).

wbr.

Автор: Jcs 28.1.2004, 16:05
Спасибо, в случае указательного каста возвращается нулевой указатель, если объект для преобразования не был создан как базовый. Толстый, однако, этот dynamic_cast, к typeinfo долбится, исключения генерит..

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)