Есть пара классов:
MyObject<-MyLabel<-
MyExtLabel MySelectable<-'
MyObject<-
MyAnotherUiObjectMySelectable<-'
У объектов MyObject есть метод parent() const, позволяющий получать предка вплоть до последнего уровня.
У объектов MySelectable есть метод SetState(int s), позволяющий менять статус "выбран/не выбран", в зависимости от которого меняется внешний вид.
При получении сообщения о нажатии/наведении указателя от контрола (MyExtLabel/MyAnotherUiObject/etc) классом приложения напрашивается следующий код для установления состояния для выбранного контрола и всех его предков:
C++ (Qt)
void SetStateUpstair(const MyObject* start, const MyObject* end, int s)
{
MyObject* o = const_cast<MyObject*>(start); //FFFFFUUUUUUUUUUUUU!!!!!
do
{
//Another FFFFFUUUUUUUUUUUUU!!!!
MySelectable* sel = dynamic_cast<MySelectable*>( o );
if( sel )
{
sel->SetState( s );
o = o->parent();
}
} while( o != end );
}
dynamic_cast возвращает не 0, т.е. кастуется объект верно, для тех, кто наследует MySelectable, однако внутренние поля 'state' и 'prevState' содержат мусор (в конструкторе они инициализируются нулями), т.е. вроде как скастовалось-то неверно. И действительно, по завершении работы метода все статусы у всех контролов не изменяются.
Как бы это победить и какой раздел Страуструповской книжки мне надо перечитать ещё раз?