Здравствуйте, ilya_ny, Вы писали:
_>Вопрос: _>Почему нужно избегать использования <dynamic_cast>? _>Чем использования <dynamic_cast> плохо?
_>Что вы по этому думаете. _>Спасибо
dynamic_cast использует RTTI и нарушает полиморфизм.
А вообще, ничего плохого, используй наздоровье...
Имею скафандр — готов путешествовать!
Re: <dynamic_cast> - почему этого нужно избегать (теор. вопр
Здравствуйте, ilya_ny, Вы писали:
_>Вопрос: _>Почему нужно избегать использования <dynamic_cast>? _>Чем использования <dynamic_cast> плохо?
_>Что вы по этому думаете. _>Спасибо
Избегать не нужно, нужно использовать по назначению.
Хотя чрезмерное его применение зачастую означает кривой дизайн.
Re[2]: <dynamic_cast> - почему этого нужно избегать (теор. в
Здравствуйте, maq, Вы писали:
maq>Избегать не нужно, нужно использовать по назначению. maq>Хотя чрезмерное его применение зачастую означает кривой дизайн.
почему ?
Re: <dynamic_cast> - почему этого нужно избегать (теор. вопр
Здравствуйте, ilya_ny, Вы писали:
_>Вопрос: _>Почему нужно избегать использования <dynamic_cast>? _>Чем использования <dynamic_cast> плохо?
_>Что вы по этому думаете. _>Спасибо
Если (предположительно) производная сущность в действительности не является объектом производного типа, то dynamic_cast либо вернет NULL (при преобразовании указателей), либо выбросит исключение (при преобразовании ссылок).
... << RSDN@Home 1.1.0 stable >>
Re: <dynamic_cast> - почему этого нужно избегать (теор. вопр
Здравствуйте, ilya_ny, Вы писали:
_>Вопрос: _>Почему нужно избегать использования <dynamic_cast>? _>Чем использования <dynamic_cast> плохо?
Это не 100% плохо, а как правило плохо. Т.к. вместо этого нужно использовать полиморфизм. Иначе создается излишнее зацепление на типы Foo и Bar
Т.е. вместо кода
if (Foo* foo=dynamic_cast<Foo*>(a))
{
}
else
if (Bar* bar=dynamic_cast<Bar*>(a))
{
}
нужно использовать
a->virtualFunction();
Для того чтобы понять чем это лучше подумай что будет если ты добавишь еще пару типов. В этом случае тебе придется повыцеплять все if-ы в 100 местах программы, а при использовании полиморфизма ты просто напишешь еще 2 реализации класса.(Возможно кода будет столько же, но во втором случае это не модификация существующего, а добавление нового, соответственно меньше шансов что нибудь сломать)
Любая проблема дизайна может быть решена введением дополнительного абстрактного слоя, за исключением проблемы слишком большого количества дополнительных абстрактных слоев
Re[3]: <dynamic_cast> - почему этого нужно избегать (теор. в
Здравствуйте, ilya_ny, Вы писали:
_>Здравствуйте, maq, Вы писали:
maq>>Избегать не нужно, нужно использовать по назначению. maq>>Хотя чрезмерное его применение зачастую означает кривой дизайн. _>почему ?
Потому что пользователю классов придется знать слишком много об иерархии классов.
В идеале ведь как?
Если у тебя есть скажем указатель (интерфейс) на базовый класс,
то тебе должно быть все равно, что за ним на самом деле скрывается.
Если не все равно, и тебе нужны какие-то детали реализации,
то значить интерфейс был продуман недостаточно хорошо.
Не знаю насколько удачный пример, но представь, что тебе
для включения ТВ постоянно приходилось бы открывать крышку
и соединять какие-то два проводка. Будет работать? Да, будет работать!
Удобно? Скорей всего нет...
Re: <dynamic_cast> - почему этого нужно избегать (теор. вопр
Здравствуйте, Azir, Вы писали:
A>Здравствуйте, ilya_ny, Вы писали:
_>>Вопрос: _>>Почему нужно избегать использования <dynamic_cast>? _>>Чем использования <dynamic_cast> плохо?
A>Как и любое другое приведение типов, не безопасно. Вот пример:
А чем? Если a не сможет быть приведен к B*, то dynamic_cast вернет 0. Главное учесть это в коде и все.
Re[4]: <dynamic_cast> - почему этого нужно избегать (теор. в
Здравствуйте, rus blood, Вы писали:
RB>И вызывать его методы напрямую, не используя полиморфизм.
Да ну? Если функция виртуальная то и вызываться она будет как виртуальная.
... << RSDN@Home 1.1.3 beta 1 >>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[3]: <dynamic_cast> - почему этого нужно избегать (теор. в
Здравствуйте, Анатолий Широков, Вы писали:
АШ>А чем? Если a не сможет быть приведен к B*, то dynamic_cast вернет 0. Главное учесть это в коде и все.
Оказывается, здесь у меня пробелы в образовании, спасибо за просвещение.
Re: <dynamic_cast> - почему этого нужно избегать (теор. вопр
Здравствуйте, ilya_ny, Вы писали:
_>Вопрос: _>Почему нужно избегать использования <dynamic_cast>? _>Чем использования <dynamic_cast> плохо?
Почему плохо? Завист от того, где испоьзовать.
Спички — это тоже плохо, но иногда необходимо
_>Что вы по этому думаете. _>Спасибо
Иногда логика программы может быть построен на dynamic_cast'е как способе получения интерфейса.
Это один из способов построения гибкой эволюционной системы и ничего плохого в этом нет.
Другое дело что dynamic_cast можно использовать для получения конкретного класса, это уже действительно может быть признаком плохого дизайна, но совсем не обязятельно.
Re[2]: <dynamic_cast> - почему этого нужно избегать (теор. в
Здравствуйте, Anatolix, Вы писали:
A>Здравствуйте, ilya_ny, Вы писали:
_>>Вопрос: _>>Почему нужно избегать использования <dynamic_cast>? _>>Чем использования <dynamic_cast> плохо?
A>Это не 100% плохо, а как правило плохо. Т.к. вместо этого нужно использовать полиморфизм. Иначе создается излишнее зацепление на типы Foo и Bar A>Т.е. вместо кода
[skipped]
Не всегда возможно.
Пример на вскидку (не идеальный)
Например твоя система создает обьект (некоторое событие). Допустим у тебя есть некто, кто с этими событиями работает.
Все хорошо пока у тебя не появляется еще один клиент событий, которому требуется расширенный интерфейс события.
Тогда на выручку приходит dcast. Ты реализуешь в событии, предназаначеном для этого клиента, еще и расширенный интерфейс, а получает его клиент именно через dcast.
A>Более подробно можно почитать вот здесь A>http://anatolix.naumen.ru/oop.pdf
мммм, лучше ....
Здравствуйте, maq, Вы писали:
maq>Здравствуйте, ilya_ny, Вы писали:
_>>Вопрос: _>>Почему нужно избегать использования <dynamic_cast>? _>>Чем использования <dynamic_cast> плохо?
_>>Что вы по этому думаете. _>>Спасибо
maq>Избегать не нужно, нужно использовать по назначению. maq>Хотя чрезмерное его применение зачастую означает кривой дизайн.
Скажем, если приходится делать выбор между идентификатором класса и dynamic_cast<>, то лучше ессно использовать dynamic_cast<>. IMHO — безопаснее.
Компьютер сделает всё, что вы ему скажете, но это может сильно отличаться от того, что вы имели в виду.
Re[3]: <dynamic_cast> - почему этого нужно избегать (теор. в
_>Почему нужно избегать использования <dynamic_cast>?
"Почему нужно избегать использования молотка? Потому, что если системный блок построен на гвоздях — это признак плохого дизайна."
Dynamic_cast — это инструмент. Как и любой инструмент, он может быть применен неправильно или не там. Инструмент, кроме того, дорогостоящий. Но это совершенно не значит, что его использования следует избегать.
_>Чем использования <dynamic_cast> плохо?
Ничем.