|
0 / 0 / 0
Регистрация: 18.09.2018
Сообщений: 4
|
|
Восходящее преобразование массива производного класса к родительскому?03.01.2020, 22:54. Показов 7701. Ответов 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
Восходящее преобразование Восходящее преобразование, объяснить код |
|
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|
| 05.01.2020, 00:04 | |
|
rat0r, в книге Programming: Principles and Practice Using C++ Страуструп проделывает такой же фокус(глава 25.4), и никакой проверки
(reinterpret_cast<base**>(0) + 1) == reinterpret_cast<base**>(reinterpret_cast<der**>(0) + 1)(ну или как там можно это проверить и вообще можно ли) не делает. Получается папа учит детишек говнокодить?
1
|
|
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|||||||||||
| 05.01.2020, 00:31 | |||||||||||
|
А причины по которым какую-то ситуацию обозначили как UB — это другой вопрос (и банально манёвр в сторону ).То-то и оно. ![]() Так что, UB это когда явно написано что UB или явное описание поведения отсутствует (неявное UB). А не когда сегфолт (или что ещё тобой неожиданное) случается. Добавлено через 1 минуту Добавлено через 2 минуты
0
|
|||||||||||
|
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|
| 05.01.2020, 00:39 | |
|
0
|
|
|
Комп_Оратор)
|
|||
| 05.01.2020, 00:40 | |||
Мне кажется я задал верный вопрос изначально. Независимо от дальнейшего обсуждения.
0
|
|||
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
||||
| 05.01.2020, 00:55 | ||||
|
0
|
||||
|
140 / 110 / 60
Регистрация: 26.10.2013
Сообщений: 314
|
|
| 05.01.2020, 01:10 | |
|
rat0r, нормативный текст, приведенный вами, не имеет никакого отношения к коду hoggy. Поэтому действительно не понятно, что именно вы пытаетесь доказать.
1
|
|
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
| 05.01.2020, 01:18 | |
|
0
|
|
|
Комп_Оратор)
|
|||
| 05.01.2020, 01:33 | |||
|
rat0r, вы запостите сюда тот фрагмент который имеете ввиду за Как я перевёл P и Q это адресные выражения указывающие на элементы одного массива. И говорится от том, что они (любой из них) должны иметь базовый тип совместимый с типом элемента и квалификаторы должны поддерживать "симиларити". Это мне нужно ещё перечитать (стандарт пишут мрачные садисты, которые гордятся своими IQ, хотя читая по настоящему базовые концепции я не вижу оснований). То есть указатель на константу может указывать на не константу но не наоборот? Или имеется ввиду полное совпадение cv сигнатур для P и Q выраженных как cv T? Тут если кто объяснит просто и кратко, буду признателен.
1
|
|||
|
140 / 110 / 60
Регистрация: 26.10.2013
Сообщений: 314
|
|
| 05.01.2020, 01:45 | |
|
IGPIGP, всё-таки пусть для нас эту цитату переведут.
Как понял я, самую суть: Есть два выражения, P и Q. Если хотя бы одно из них имеет тип T *, и если этот T * - не указатель на массив, то это UB. Один из кейсов - мы не можем взять адрес какого-то отдельного объекта, и прибавить, скажем, единицу. Как это увязать с кодом выше - для меня загадка. rat0r, нет, не забыл.
0
|
|
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|||||
| 05.01.2020, 01:50 | |||||
|
Ты не знаешь, что такое нормативный текст? Примечение (Note) это не нормативный текст. Нормативный — до Note.
0
|
|||||
|
Комп_Оратор)
|
|||
| 05.01.2020, 02:10 | |||
|
Добавлено через 8 минут Однако, того что я понял пока достаточно, чтобы видеть, что это не к случаю.
0
|
|||
|
6353 / 3524 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
|
|
| 05.01.2020, 02:18 | |
|
IGPIGP, согласно определению base* и der* не similar, а стандарт написан по принципу "я не я и хата не моя", другими словами он не запрещает(наверное) компиляторам реализовать различное представление указателей на разные типы(разный размер, выравнивание, арифметика), главное что бы правила преобразований работали.
1
|
|
|
Комп_Оратор)
|
||
| 05.01.2020, 02:25 | ||
T=Base*. А указатели P и Q это указатели на этот тип. Я уже не знаю как ещё попросить объяснить, что тут не similar...
0
|
||
|
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
|
|||||||
| 05.01.2020, 02:38 | |||||||
|
ты серьёзно не можешь предсказать что должен сделать код, и что он сделает по факту? серьёзно думаешь, что результат непредсказуемый??? но в данном случае поведение определенное. оно опредленное не просто потому, что соответствует ожидаемому мной результату. и даже не только потому, что по факту отрабатывает именно так, как я этого ожидаю, но ещё и потому, что не может отработать как то иначе. и если ты читал те самые книжки на которые любишь ссылаться, и знаешь как обязана работать адрессная арифметика указателей, то ты должен понимать, почему мой код работает именно так, как он работает. и должен понимать, почему он не может сработать как то иначе. если ты этого не понимаешь, ну даже не знаю тогда. тогда получается, ты смотришь в книгу, а видишь фигу. я не писал про них, потому что писал не о них. ты как вообще, русский текст нормально воспринимаешь? я писал про ре-интерпритацию. конкретно: что в отличие от легальных преобразований типов, в случае ре-интерпритации не делается никаких дополнительных вычислений. в результате можно поиметь некорректный результат. "ре-интерпритация" отличается от "легальных преобразований", но из этого никак не следует, что она - нелегальная. за который к человеку была применена мера наказания. формально, убивать людей - это нарушение закона. но если после убийства тебя оправдали в суде, значит формально закон ты не нарушил. я прекрасно понимаю твою точку зрения. и понимаю, что ты пытаешься мне сообщить. совершенно справедливо ты можешь сказать, что написанный мною код попадает под описание общего случая, последствия которого стандарт трактует как UB. но ты не можешь так сказать про совершенно конкретный случай, который не оставляет место неопределенности. понимаешь в чем фокус? неопределенное поведение должны быть неопределенным. а иначе, это уже не UB. я же не забыл сказать тебе "спасибо" ? если тебе нужны манёвры - ты ошибся с собеседником. на самом деле причины - это самое важное. это - суть. причины дают самое важное - понимание. в нашем с тобой случае - понимание того, почему мой код ведет себя совершенно определенным образом. и почему он не может повести себя как то иначе. когда ты в следующий раз захочешь прокомментировать чей-то код, подумай о том, что на самом деле ты комментируешь: реальный код, с его реальными проблемами (если она там вообще есть) или гипотетические проблемы гипотетической абстрактной машины.
0
|
|||||||
|
Комп_Оратор)
|
|||||||
| 05.01.2020, 03:42 | |||||||
|
rat0r, приношу извинения. На мой вопрос вы ответили невнятно. Ни к чему было обновлять страницу. Речь была не о array-to-pointer-decay. Я то думал что передаётся во всех случаях Base** но инициализированный разными объектами/подобъектами... Теперь ясно к чему цитата. GoshaRubi, нет смысла в контексте полиморфного вызова в массивах из указателей на подобъекты. Именно массивы указателей на базовый класс полезны. А на этих указателях могут висеть любые типы иерархии. Тогда это имеет смысл. Иначе может помочь перегрузка, например, но о полиморфизме для Derived** перегрузки придётся забыть. А вот функция принимающая Base** сможет раскрыть возможность вызова виртуального метода. Вот такой код возможен:
1
|
|||||||
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
|
| 05.01.2020, 03:47 | |
|
1
|
|
|
Комп_Оратор)
|
||
| 05.01.2020, 12:34 | ||
|
Хотелось бы всё же понять, что подвигло комитетчиков считать что ponter to pointer to derived нельзя использовать как pointer to pointer to base в контексте как итерации по массиву так и доступа к членам суперкласса. Какие подводные камни скалистого дна С++ могут ранить на этот раз? -Размеры указанных ponter to pointer'ов могут отличаться? Если да, - когда, где и по какой причине. -Доступ к по указателю Base* к объекту по его адресу сохранённому в Derived* в рамках строго ограниченных возможностями Base уже не законен? Если да, - когда, где и по какой причине. А формально, - вы правы. В стандарт записали, что это фактически запрещено в контексте как итерации по массиву так и доступа к членам суперкласса. Или по крайней мере в одной из частей данного контекста. Но почему?
0
|
||
|
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
|
||
| 06.01.2020, 03:36 | ||
base* и der* одинаковый размер, читать значение из объекта типа der* через glvalue с типом base* это банально нарушение т.н. strict aliasing rules.
2
|
||
|
Комп_Оратор)
|
||
| 06.01.2020, 03:56 | ||
|
Указатель базового может быть использован для доступа к производному. Тут нет нарушения. А указатель на указатель к базовому нельзя использовать как указатель на указатель к производному(!). Вообще, если говорить о нормативной документации, правовой, технической и в частности - стандартах то читая то что называют стандартами в ПО приходится сдерживать ненормативную лексику. В частности в данном случае сказано о том что типы "подобны/similar" если совпадают cv сигнатуры и базовые типы (U), Но это же очевидно. То есть если это один и тот же тип то это нечто подобное (самому себе). То есть, данное условие - тавтология. И может быть принято как достаточное условие в качестве отправной точки (неуклюжий вариант). А далее можно формулировать случаи когда возможны отличия при сохранении подобия (similarity). Что там далее и делается. Возможно поленились учесть случай для указателей на классы иерархии.
0
|
||
| 06.01.2020, 03:56 | |
|
Восходящее и нисходящее преобразование (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, синий туман.
Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
|