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

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

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

23 ответов

18 просмотров

На половину верно, можешь добраться, если знаешь производный класс и применишь 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
Если честно, то сам забыл. Я просто хотел закрепит...

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

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

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

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
why html and css is not standard? i mean why different browser has their own engine and styles and how them work to show result to end user?
Mr Thieves
11
TCodePointer = record cp: CodePointer; name: string; cnt: Integer; next: TCodePointerArray; // этот тип ещё неизвестен end; TCodePointerArray = array of ...
notme
9
Привет ) есть такой кусок кода, он считывает ini файл. my $conf = Config::IniFiles->new( -file => $ini_file ); if (!$conf) { $self->my_die('cannot_read_cfg', ...
Kolya lastname
7
Добрый день. Хочу сделать отрисовку по команде на панели. Почему-то рисуется только при втором вызове. С чем может быть связано, не подскажете? procedure TForm1.FormDblClick(...
Kirill Filippenok
20
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Блин, интересно, кто-нибудь когда-нибудь переписывал какую-нибудь игру с x86 на arm? Вообще, такое возможно?
Alan 🔝 Бэброу
13
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Всем привет! Нужен совет от опытных. Переношу свой проект с Делфи 10.2 Токио на Лазарус 3.2 установленный через инсталлятор fpcupdeluxe-x86_64-win64. При импортировании проект...
Дмитрий Завгородний
7
Всем доброго дня! Подскажите может кто использовал связку Pagebuilder + Clientsetting. Сами параметры с типом pagebuilder в модуле Clientsetting работают нормально, можно такж...
Александр Добриков
12
Карта сайта