Как стать автором
Обновить

Комментарии 16

Хорошо бы добавить результат работы каждого из приведенных блоков, чтобы не отвлекаться от чтения.
Еще можно поиграться, с виртуальным наследование. Посмотреть, что и как располагается в памяти.
Думаю, не стоит без крайней необходимости и абсолютной уверенности использовать приведение от предка к наследнику. Ни static, ни dynamic.
Да, dynamic_cast в большинстве случаев отработает более корректно, но, в любом случае, это будет ошибка проектирования, которая переносится из compile-time в runtime.
dynamic_cast в большинстве случаев отработает более корректно

Можно пример случая когда отработает некорректно?

С -no-rtti? Но и так он будет корректно работать для типов для которых это можно доказать в compile time

Ну -no-rtti — это всё-таки весьма специфический случай (да ещё и нестандартный).

Говорят в темные времена были проблемы с версиями компиляторов и библиотек, но я их не застал. Думаю костыли типа qobject_cast из тех же времен.

Он не требует RTTI, но работает только с наследниками QObject и в класе должен был использован макрос Q_OBJECT. Подозреваю, что они его сделали для своих каких-то целей. Qt, на мой взгляд, не просто фреймворк/библиотека, а почти отдельный язык базирующийся на C++.

Насколько я знаю, qobject_cast скорее для скорости.

Такое же советуют и доке Qt. Но вроде бы исходно он возник из за кривости очень старых плюсов. Как и всякая хрень типа qMax

struct A{
    A():a(0), b(0){}
  int a;
  int b;
};
struct B : A{

ну вы чё, а?
здорово, что вы, как автор, в контексте, и понимаете что a и b лежат в A, а B лежит g…
но читать же нереально — это противоречит логике.
пусть в A лежат a1 и a2, в B — b или b1. Сразу понятно кто к кому относится.

offtopic
я сюда деградировать захожу, а не транслировать переменные в голове

Вы описали мою первыю мысль, 4 часа назад прочитал статью про именование переменных и осмысленные названия всего, а тут на тебе мы вернулись в 8й класс и обзываем все однобуквенно и пусть лежат в А a,b; Но блин как понять читая код что В зависит от А и остальное наследование, это очень важно, отсюда и такие ошибки, для этого не обязательно использовать dynamic_cast для этого можно использовать меньше указателей и адекватные названия.
Дельное замечание, почему то не подумал заранее. Спасибо

Вообще если понадобился dynamic_cast — время взять листок бумаги и заняться проектированием, что-то пошло не так. Обычно решается добавлением по иерархии ещё одной виртуальной функции, но где-то удобен visitor. А может — надо просто почистить и упростить код.

Хм… А у меня у одного последний пример не компилится?
error C2683: 'dynamic_cast': 'A' is not a polymorphic type

Читайте внимательнее.
"Для того, чтобы такая проверка была возможна, следует добавить к классам виртуальность (dynamic_cast использует таблицы виртуальных функций, чтобы делать проверку)."

НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории