указателей. Верно ли, что если я имею указатель типа базовый класс, но указывающий по факту на производный, я не могу через стрелку добраться до поля производного класса (которого не было в базовом)? Я могу до него добраться только посредством виртуального переопределенного метода. Это верно или нет?
На половину верно, можешь добраться, если знаешь производный класс и применишь dynamic cast
если знаешь производный класс то можно просто static_cast =)
Опасно, надо знать ещё что это точно экземпляр именно этого класса
А существуют ли какие нибудь способы принудительно устанавливать в базовый класс информацию , является ли он по факту производным? Я знаю только CRTP, там в базовый класс просто внедряется функция кастования к производному. А еще какие нибудь способы есть? Ну например, в поле базового класса держать какую нибудь просто текстовую информацию и получив, допустим из этого поля строку "автомобиль:феррари" , иметь таблицу соответствия, где по ключу "феррари" мы получим адрес функции кастования к феррари и прогоним указатель на базовый сквозь неё. Быть может есть какие то хитрые варианты через using тип?
Ничего не понятно, но очень интересно... Класс он либо базовый, либо производный. Даже в CRTP.
Жду, когда ты уже будешь книги писать :)
А для чего это нужно, если есть CRTP?
Ну в принципе, да. Зачем выносить наружу кастование к производному, если сам базовый умеет это делать, так как у него внутри как раз лежит эта функция кастования. Ты прав.
У меня была ситуация, когда надо было в зависимости от типа делать определенные действия. Я сначала сделал много условных операторов с dynamic_cast'ами. Потом почитал про это и понял, что так делать нехорошо. Есть статья про шаблон double dispatch visitor. В ней как раз эта ситуация разбирается. Могу отправить сюда, если можно кидать ссылки, или в личные сообщения, если нет.
Кидай сюда конечно. Люди хотят знать правду.
Можно внутри типа хранить подтип как в итераторах. Это я не про указатели а вообще, как узнать что за тип у тебя в руках и что он умеет делать. type traits мощная штука.
https://gieseanw.wordpress.com/2018/12/29/stop-reimplementing-the-virtual-table-and-start-using-double-dispatch/
А виртуальная функция не решала проблему?
До определённого момента времени. Я пишу в RAD Studio на VCL. Стало нужно различные действия на форме совершать и подстраивать её интерфейс в зависимости от выбранного пользователем в дереве узла.
Такую информацию Не надо никуда устанавливать Она и так есть в программе, при условии что базовый класс полиморфный. Это штука называется rtti
CRTP на одного наследника только, а наследников может быть много, десятки
Не надо, полагаю все это знают. А про IF и dynamic_cast - это антипаттерн к простому полиморфизму на виртуальных методах.
Ну, так это напрямую полиморфизм
Спасибо за пояснение
Если честно, то сам забыл. Я просто хотел закрепить знания по теме указателей и размышлял как узнать, имея указатель на базовый класс, какой он все таки по факту. Потом понял, что это не надо. Нам типы как таковые же не нужны, важно то, что они делают. То есть аналогия такая - мне нужно починить машину, и у меня есть телефон (указатель ) чувака, кто умеет это делать, а кто он по факту ремонтник с дипломом гарварда или дядя Армен мне ведь без разницы, главное, чтоб он принял у меня неисправную машину и вернул исправную.
Самый интересный вариант, если это будет дядя Армен с дипломом Гарварда.
Обсуждают сегодня