LINUX.ORG.RU

QChildEvent и способы обмануть плюсовый рантайм

 ,


0

1

Написал обработчик QChildEvent'а. Столкнулся с тем что не могу dynamic_cast'ом скастовать указатель на child'а от QObject*'а к конкретному типу. Полез в документацию. Много думал.

В связи с этим два вопроса. Первый: как они защитили указатель dynamic_cast'а? Как можно вернуть указатель на объект базового класса так чтобы его нельзя скастовать к указатель на производный класс (при условии что по указанному адресу лежит объект именно этого производного класса)? Vtbl у класса есть.

Второй: как и зачем QChildEvent может оказаться в петле событий до того как child будет сконструирован?

★★★★★

По феншую надо юзать qobject_cast. Подозреваю, сломать dynamic_cast можно отключением RTTI где-нибудь, хотя велик риск, что в таком случае прога не будет компиляться.

const86 ★★★★★
()
Ответ на: комментарий от const86

qobject_cast вполне предсказуемо тоже считает что укзатель на child указывает именно на QObоject, Где нужно отключить RTTI? В остальных частях Qt и моей программы он прекрасно работает.

KblCb ★★★★★
() автор топика
Ответ на: комментарий от const86

хотя велик риск, что в таком случае прога не будет компиляться.

Qt, ЕМНИП, нормально переживает -fno-rtti

Stil ★★★★★
()
Ответ на: комментарий от Stil

Да работает rtti'же. Это какой-то очень локальный хак, если верить документации. Но я не понимаю как он работает.

KblCb ★★★★★
() автор топика

Второй: как и зачем QChildEvent может оказаться в петле событий до того как child будет сконструирован?

Ну тут всё просто: setParent() может вызываться из конструктора child'а, что приведёт к событию QChildEvent. Так как конструктор child'а не выполнился до конца, формально child еще не считается полностью созданным. Так как QChildEvent отсылается сразу (Qt::DirectConnection), то имеем QChildEvent в петле событий то того, как child полностью сконструирован.

А отсюда следует ответ на первый вопрос:

Как можно вернуть указатель на объект базового класса так чтобы его нельзя скастовать к указатель на производный класс

Производный класс еще не полностью создан, поэтому dynamic_cast возвращает 0.

sjinks ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.