|
0 / 0 / 0
Регистрация: 18.09.2018
Сообщений: 4
|
|
Восходящее преобразование массива производного класса к родительскому?03.01.2020, 22:54. Показов 6972. Ответов 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
Восходящее преобразование Восходящее преобразование, объяснить код |
|
6352 / 3523 / 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
|
|||||||||||
|
6352 / 3523 / 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
|
|||
|
6352 / 3523 / 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 | |
|
Помогаю со студенческими работами здесь
40
Восходящее и нисходящее преобразование (Upcasting and Downcasting) Неявное восходящее преобразование при защищенном/закрытом наследовании Как сложить объект базового класса с объектом производного(наследуемого класса)
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Загрузка PNG-файла с альфа-каналом с помощью библиотеки SDL3_image на Android
8Observer8 27.01.2026
Содержание блога
SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
|
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
|
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога
SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
|
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога
Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip"
Извлеките архив и вы увидите. . .
|
|
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога
Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д.
Сборка примера
Скачайте. . .
|
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
|
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net
REST сервисы временно не работают, только через Web.
Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
|
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
|