170 похожих чатов

Еще раз хочу проверить себя, правильно ли я понимаю суть

указателей. Верно ли, что если я имею указатель типа базовый класс, но указывающий по факту на производный, я не могу через стрелку добраться до поля производного класса (которого не было в базовом)? Я могу до него добраться только посредством виртуального переопределенного метода. Это верно или нет?

23 ответов

49 просмотров

На половину верно, можешь добраться, если знаешь производный класс и применишь dynamic cast

Ilya Zviagin
На половину верно, можешь добраться, если знаешь п...

если знаешь производный класс то можно просто static_cast =)

Опасно, надо знать ещё что это точно экземпляр именно этого класса

The Pressbraker- Автор вопроса
Ilya Zviagin
Опасно, надо знать ещё что это точно экземпляр име...

А существуют ли какие нибудь способы принудительно устанавливать в базовый класс информацию , является ли он по факту производным? Я знаю только CRTP, там в базовый класс просто внедряется функция кастования к производному. А еще какие нибудь способы есть? Ну например, в поле базового класса держать какую нибудь просто текстовую информацию и получив, допустим из этого поля строку "автомобиль:феррари" , иметь таблицу соответствия, где по ключу "феррари" мы получим адрес функции кастования к феррари и прогоним указатель на базовый сквозь неё. Быть может есть какие то хитрые варианты через using тип?

The Pressbraker
А существуют ли какие нибудь способы принудительно...

Ничего не понятно, но очень интересно... Класс он либо базовый, либо производный. Даже в CRTP.

The Pressbraker- Автор вопроса
frankypenkie
А для чего это нужно, если есть CRTP?

Ну в принципе, да. Зачем выносить наружу кастование к производному, если сам базовый умеет это делать, так как у него внутри как раз лежит эта функция кастования. Ты прав.

The Pressbraker
Ну в принципе, да. Зачем выносить наружу кастовани...

У меня была ситуация, когда надо было в зависимости от типа делать определенные действия. Я сначала сделал много условных операторов с dynamic_cast'ами. Потом почитал про это и понял, что так делать нехорошо. Есть статья про шаблон double dispatch visitor. В ней как раз эта ситуация разбирается. Могу отправить сюда, если можно кидать ссылки, или в личные сообщения, если нет.

The Pressbraker- Автор вопроса
frankypenkie
У меня была ситуация, когда надо было в зависимост...

Кидай сюда конечно. Люди хотят знать правду.

The Pressbraker- Автор вопроса
frankypenkie
У меня была ситуация, когда надо было в зависимост...

Можно внутри типа хранить подтип как в итераторах. Это я не про указатели а вообще, как узнать что за тип у тебя в руках и что он умеет делать. type traits мощная штука.

The Pressbraker
Кидай сюда конечно. Люди хотят знать правду.

https://gieseanw.wordpress.com/2018/12/29/stop-reimplementing-the-virtual-table-and-start-using-double-dispatch/

frankypenkie
У меня была ситуация, когда надо было в зависимост...

А виртуальная функция не решала проблему?

Alexander Karaev
А виртуальная функция не решала проблему?

До определённого момента времени. Я пишу в RAD Studio на VCL. Стало нужно различные действия на форме совершать и подстраивать её интерфейс в зависимости от выбранного пользователем в дереве узла.

The Pressbraker
А существуют ли какие нибудь способы принудительно...

Такую информацию Не надо никуда устанавливать Она и так есть в программе, при условии что базовый класс полиморфный. Это штука называется rtti

frankypenkie
А для чего это нужно, если есть CRTP?

CRTP на одного наследника только, а наследников может быть много, десятки

frankypenkie
У меня была ситуация, когда надо было в зависимост...

Не надо, полагаю все это знают. А про IF и dynamic_cast - это антипаттерн к простому полиморфизму на виртуальных методах.

The Pressbraker- Автор вопроса
Андрей Будиловский
А в чем задача?

Если честно, то сам забыл. Я просто хотел закрепить знания по теме указателей и размышлял как узнать, имея указатель на базовый класс, какой он все таки по факту. Потом понял, что это не надо. Нам типы как таковые же не нужны, важно то, что они делают. То есть аналогия такая - мне нужно починить машину, и у меня есть телефон (указатель ) чувака, кто умеет это делать, а кто он по факту ремонтник с дипломом гарварда или дядя Армен мне ведь без разницы, главное, чтоб он принял у меня неисправную машину и вернул исправную.

The Pressbraker- Автор вопроса
The Pressbraker
Если честно, то сам забыл. Я просто хотел закрепит...

Самый интересный вариант, если это будет дядя Армен с дипломом Гарварда.

Похожие вопросы

Обсуждают сегодня

Господа, а что сейчас вообще с рынком труда на делфи происходит? Какова ситуация?
Rꙮman Yankꙮvsky
29
А вообще, что может смущать в самой Julia - бы сказал, что нет единого стандартного подхода по многим моментам, поэтому многое выглядит как "хаки" и произвол. Короче говоря, с...
Viktor G.
2
30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Гайс, вопрос для разносторонее развитых: читаю стрим с юарта, нада выделять с него фреймы с определенной структурой, если ли чо готовое, или долбаться с ринг буффером? нада у...
Vitaly
9
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Добрый день! Скажите пожалуйста, а какие программы вы бы рекомендовали написать для того, чтобы научиться управлять памятью? Можно написать динамический массив, можно связный ...
Филипп
7
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
длина пакета фиксированная, или меняется?
Okhsunrog
7
Карта сайта