|
0 / 0 / 0
Регистрация: 18.09.2018
Сообщений: 4
|
|
Восходящее преобразование массива производного класса к родительскому?03.01.2020, 22:54. Показов 7444. Ответов 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) Неявное восходящее преобразование при защищенном/закрытом наследовании Как сложить объект базового класса с объектом производного(наследуемого класса)
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире.
Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
|
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С.
Задача:
Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
|
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
|
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
|
|
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701
Купил два термопринтера QR701.
На сэлф-тесте написано:
Language: PC936 (GB18030).
Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
|
Создание формы заимствованного документа
Maks 03.08.2026
Задача:
Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также
табличная часть со следующими реквизитами:
- Расчетный счет покупателя. . .
|
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача:
В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
|
Почему SEO не начинается с ключевых слов: что проверить до написания текстов
Neotwalker 01.08.2026
Когда владельцу сайта предлагают заняться SEO, первым шагом часто становится сбор запросов и написание текстов.
Логика кажется понятной:
1. Находим ключевые слова.
2. Добавляем их на. . .
|