|
0 / 0 / 0
Регистрация: 18.09.2018
Сообщений: 4
|
|
Восходящее преобразование массива производного класса к родительскому?03.01.2020, 22:54. Показов 7699. Ответов 114
Есть два класса base_Class(родитель) и derived_Class(потомок)
Есть некая виртуальная функция в base_Class которая принимает в качестве параметра массив объектов класса f(base_Class **mass) Чтобы воспользоваться данной функцией для производного класса, необходимо привести массив производного класса к массиву родительского Массивы: base_Class *baseMass[100], derived_Class *derivedMass[100] Как произвести такое приведение типов?
0
|
|
| 03.01.2020, 22:54 | |
|
Ответы с готовыми решениями:
114
Восходящее преобразование Восходящее преобразование, объяснить код |
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
| 06.01.2020, 04:03 | |
|
1
|
|
|
Комп_Оратор)
|
|||||
| 06.01.2020, 12:05 | |||||
Добавлено через 8 минут Но если исходить из
Там далее указаны требуемые условия по cv когда они допускают отличия но важно же не это. Важно что мы знаем что преобразование Derived* в Base* допускается языком. А тот факт что, скажем, возможно Derived* в const Base* не имеет к нашему случаю отношения.
0
|
|||||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
||||||||
| 06.01.2020, 13:25 | ||||||||
Добавлено через 1 минуту
0
|
||||||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 06.01.2020, 14:19 | |
|
0
|
|
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|||||||||
| 06.01.2020, 16:22 | |||||||||
|
Вы достаточно наблюдательны. derived* в base* вполне валидное преобразование, но derived** в base** - уже не уверен.Правда я так и не понял к чему здесь
Добавлено через 49 минут И, по-моему, у hoggy как раз все ок, ведь у него массив указателей, а не массив объектов:
1
|
|||||||||
|
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|
| 06.01.2020, 16:45 | |
|
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||
| 06.01.2020, 17:08 | |||
|
это не значит любой такой каст обязательно спровоцирует UB. в отдельном частном случае корректный результат гарантирован.
1
|
|||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|||
| 06.01.2020, 17:18 | |||
|
Как уже говорилось преобразование derived* в base* вполне валидное и не требует никаких танцев с бубнами, но вот уже derived** в base** можно преобразовать только через reinterpret. Это из-за того, что после разыменования base** мы можем получить base*, который указывает уже не на derived, а на некого другого наследника, что не очень круто. Добавлено через 1 минуту
0
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|
| 06.01.2020, 17:20 | |
|
0
|
|
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|||||||
| 06.01.2020, 17:24 | |||||||
|
Кликните здесь для просмотра всего текста
Так же, наверное, важно упомянуть наличие виртуальных таблиц у наследников, благодаря чему это работает.
1
|
|||||||
|
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
||
| 06.01.2020, 17:25 | ||
|
1
|
||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|||
| 06.01.2020, 17:30 | |||
|
И мой пример выше, просто пример, что так тоже может быть. Добавлено через 2 минуты
0
|
|||
|
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|
| 06.01.2020, 17:35 | |
|
0
|
|
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 06.01.2020, 17:40 | |||||||
|
что косяк здесь не в двойном касте. а в некорректной ре-интерпритации типов. твой пример можно подсократить вообще без каста двойного указателя, но суть не изменится:
1
|
|||||||
|
Mental handicap
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
|
|||
| 06.01.2020, 17:50 | |||
![]() Добавлено через 10 минут
1
|
|||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||
| 06.01.2020, 18:08 | ||
|
все неявные касты обязаны быть безопасными. хочешь сделать что-то потенциально опасное - делай явно. derived** в base** не просто опасен, он классифицируется как UB, потому что в общем случае корректность результата не может быть гарантирована и по этой причине, лучше вообще так не кастить. конечно, если у тебя дилема: делать медленную копию массива из 10'000'000 элементов, или кастануть за мгновение, тогда есть резон. но нужно понимать риски. сегодня там одиночное наследование и этот трюк работает. а завтра твой коллега модифицирует строение клаccа, и приплыли. и если, допустим, это - одноразовая акция, тогда может фиг бы с ним, сделаем честную копию массива? пускай медленно. зато безопасно, да и делаем только один раз.
2
|
||
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
||||
| 06.01.2020, 19:11 | ||||
derived d; derived* dptr = &d; reinterpret_cast<base**>(&dptr); неопределённое поведение?Добавлено через 8 минут
0
|
||||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
||||
| 06.01.2020, 19:46 | ||||
|
какое отношение твоя ссылка имеет к твоему утверждению? работы с некорректными данными. поведение представленного тобою фрагмента кода вполне себе определенно. а вот что будет дальше, когда ты попробуешь использовать результат reinterpret_cast<base**>(&dptr) - это вопрос.
0
|
||||
| 06.01.2020, 19:46 | |
|
0
|
|
| 06.01.2020, 19:46 | |
|
Восходящее и нисходящее преобразование (Upcasting and Downcasting) Неявное восходящее преобразование при защищенном/закрытом наследовании Как сложить объект базового класса с объектом производного(наследуемого класса)
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
|
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#.
Название изменил на ColorStep.
Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
|
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами:
- ВидТО (СправочникСсылка. ВидыТО);
- ВидГСМ. . .
|
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала.
Ниже прикреплён. . .
|
|
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F
Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU.
Опрашиваются регистры. . .
|
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка:
Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
|
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо
Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
|
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|