Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/30: Рейтинг темы: голосов - 30, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 18.09.2018
Сообщений: 4

Восходящее преобразование массива производного класса к родительскому?

03.01.2020, 22:54. Показов 7071. Ответов 114

Студворк — интернет-сервис помощи студентам
Есть два класса base_Class(родитель) и derived_Class(потомок)
Есть некая виртуальная функция в base_Class которая принимает в качестве параметра массив объектов класса f(base_Class **mass)
Чтобы воспользоваться данной функцией для производного класса, необходимо привести массив производного класса к массиву родительского
Массивы: base_Class *baseMass[100], derived_Class *derivedMass[100]
Как произвести такое приведение типов?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.01.2020, 22:54
Ответы с готовыми решениями:

Определить обработчик исключений на преобразование указателя базового класса на указатель производного класса
Класс В является производным от класса А. Определить обработчик исключительной ситуации на преобразование указателя базового класса А на...

Восходящее преобразование
помогите пожайлуста разобраться, почему выдаёт ошибку... public class A{ public int f1(){return 1;}; public int...

Восходящее преобразование, объяснить код
Всем привет! Мне не понятен один момент в восходящем преобразовании. Есть два класса: один базовый, другой производный от базового. В...

114
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
06.01.2020, 22:47
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от IGPIGP Посмотреть сообщение
Это и есть выражение P/Q
Цитата Сообщение от IGPIGP Посмотреть сообщение
стандарт запрещает P->Q
Почему ты постоянно говоришь про какое-то выражение Q?
В https://timsong-cpp.github.io/... expr.add#6 выражения P и Q отсылают к 4-му и 5-му параграфу, но Q есть только в 5-м, который говорит про вычитание двух указателей. А в 4-м параграфе, про сложение указателя с целым, из P и Q есть только P.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
06.01.2020, 22:51

Не по теме:

Цитата Сообщение от IGPIGP Посмотреть сообщение
Где он может создать проблему?
на сферической машине в сферическом вакууме :)



Добавлено через 3 минуты
Цитата Сообщение от IGPIGP Посмотреть сообщение
Я помню у Страуструпа хороший кусок посвящён
Да, я выше даже ссылку давал, он там обертку над массивом делает array_ref<T>, и так же, как hoggy, делает преобразование array_ref<der*> -> const array_ref<base*const>
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
06.01.2020, 22:55
Цитата Сообщение от rat0r Посмотреть сообщение
А в 4-м параграфе, про сложение указателя с целым, из P и Q есть только P.
Они в первом упоминании идут вместе. Если о НТД говорить, то я пытаюсь цитировать по первому упоминанию. Так текст составлен - я не виноват.
Цитата Сообщение от zayats80888 Посмотреть сообщение
на сферической машине в сферическом вакууме
Нет. Вакуум и конь - разные вещи. Речь идёт о указателях на указатели на члены иерархии. Сами указатели на члены иерархии преобразуются снизу вверх. Почему типы хранящие их адреса не преобразуются? Что помешало это разрешить? Какие кейсы взволновали пейсы?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
06.01.2020, 22:58
Цитата Сообщение от IGPIGP Посмотреть сообщение
Почему типы хранящие их адреса не преобразуются? Что помешало это разрешить? Какие кейсы взволновали пейсы?
Я разработкой компиляторов и способов оптимизации машинного кода не занимаюсь, это не ко мне.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
06.01.2020, 23:05
Цитата Сообщение от zayats80888 Посмотреть сообщение
Я разработкой компиляторов и способов оптимизации машинного кода не занимаюсь, это не ко мне.
Вряд ли это требуется. Вопрос того почему существует неявное преобразование указателя Derived* в Base* не требует таких знаний. Но типы Derived и Base хоть и пересекаются по функционалу, но обычно имеют разный размер, в то время как Derived** в Base** равны как по размеру так и по функционалу. Что смутило комитет?
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
06.01.2020, 23:09
Цитата Сообщение от IGPIGP Посмотреть сообщение
Они в первом упоминании идут вместе. Если о НТД говорить, то я пытаюсь цитировать по первому упоминанию. Так текст составлен - я не виноват.
Т.е. даже после того, как тебе показали, что дёргать нерелевантные куски из параграфа — это не лучшая идея, ты решил продолжать?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
06.01.2020, 23:17
rat0r, таки и почему там нарушение "strict aliasing rule"?
Если у нас есть тип X и тип Y, где X является базовым классом Y, то такие типы являются "related types". Ведь мы же можем их неявно кастить:
C++
1
2
3
4
5
6
7
struct X {};
struct Y : X {};
 
int main() {
  Y  y;
  X* xp = &y; // static_cast<X*>(&y)
}
Цитата Сообщение от IGPIGP Посмотреть сообщение
в то время как Derived** в Base** равны как по размеру так и по функционалу. Что смутило комитет?
Восходящее преобразование массива производного класса к родительскому?
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
06.01.2020, 23:19
Цитата Сообщение от IGPIGP Посмотреть сообщение
в то время как Derived** в Base** равны как по размеру так и по функционалу. Что смутило комитет?
Azazel-San и hoggy выше приводили примеры "неприятностей". А С++ вроде позиционируется "типобезопасным"
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
06.01.2020, 23:25
Цитата Сообщение от Azazel-San Посмотреть сообщение
таки и почему там нарушение "strict aliasing rule"?
Где — там? В первом ответе? Можно сказать что там нет нарушения, т.к. UB наступает раньше чем такое нарушение могло бы произойти.
В Восходящее преобразование массива производного класса к родительскому? я имел в виду что не будь UB из-за https://timsong-cpp.github.io/... expr.add#6, UB возникло бы из-за нарушения strict aliasing rule.
Если исключить арифметику, как в Восходящее преобразование массива производного класса к родительскому?, то UB будет из-за нарушения strict aliasing rule.

Добавлено через 2 минуты
Цитата Сообщение от Azazel-San Посмотреть сообщение
Ведь мы же можем их неявно кастить:
Здесь нет доступа к объекту (чтения) с типом Y* через glvalue с типом X*.
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2020, 23:38
Цитата Сообщение от rat0r Посмотреть сообщение
Нет, не такой кейс. zayats80888 написал правильно:
base** b = reinterpret_cast<base**>(&p);
(*b)->foo();
я вообще уже перестал тебя понимать.

ты по-человечески разговаривать совсем не умеешь?

Добавлено через 3 минуты
бред какой то.
в моём примере нет ни UB,
ни нарушений стрикт-алиасинга.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
06.01.2020, 23:44
Цитата Сообщение от rat0r Посмотреть сообщение
Здесь нет доступа к объекту (чтения) с типом Y* через glvalue с типом X*.
А так:
C++
1
2
3
4
5
6
7
8
struct X { int i; };
struct Y : X {};
 
int main() {
  Y  y;
  X* xp = &y; // static_cast<X*>(&y)
  (void)xp->i;
}
?
Строка (void)xp->i; получается UB?
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
06.01.2020, 23:54
Цитата Сообщение от hoggy Посмотреть сообщение
я вообще уже перестал тебя понимать.
Чтобы перестать надо хотя бы начать. Но с пониманием у тебя вообще туго.
Цитата Сообщение от hoggy Посмотреть сообщение
ты по-человечески разговаривать совсем не умеешь?
Если тебе не понятно, что такое glvalue of class type и/или "доступ через glvalue типа base*", то с такими азбучными вопросами велкам ту https://www.cyberforum.ru/cpp-beginners/
Цитата Сообщение от Azazel-San Посмотреть сообщение
А так:
И так нет...
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2020, 23:57
Цитата Сообщение от rat0r Посмотреть сообщение
Но с пониманием у тебя вообще туго.
ты обратил внимание: тебя тут вообще мало кто понимает?
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
07.01.2020, 00:00
Цитата Сообщение от hoggy Посмотреть сообщение
ты обратил внимание: тебя тут вообще мало кто понимает?
И какой из этого вывод?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.01.2020, 00:00
Цитата Сообщение от rat0r Посмотреть сообщение
Если тебе не понятно, что такое glvalue of class type
кто нибудь из присутствующих может объяснить, что такое "glvalue of class type" ?
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
07.01.2020, 00:05
Цитата Сообщение от rat0r Посмотреть сообщение
И так нет...
Нет, потому что:
1) Классы должны быть полиморфными?
C++
1
2
3
4
5
6
7
8
struct X { virtual void f(); };
struct Y : X { void f() override; };
 
int main() {
  Y  y;
  X* xp = &y; // static_cast<X*>(&y)
  xp->f();
}
2) Каст должен быть именно через указатель на указатель?
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
07.01.2020, 00:10
Цитата Сообщение от Azazel-San Посмотреть сообщение
Нет, потому что:
Потому что доступа через glvalue с типом Y* нет.
Цитата Сообщение от Azazel-San Посмотреть сообщение
Каст должен быть именно через указатель на указатель?
Я бы не называл это кастом.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
07.01.2020, 00:11
Цитата Сообщение от rat0r Посмотреть сообщение
Т.е. даже после того, как тебе показали, что дёргать нерелевантные куски из параграфа — это не лучшая идея
Не помню. Кто показал лучшую идею? rat0r, с вашим воспитанием (это тыканье постоянно) не стоит и пытаться меня воспитывать. Что касается P и Q то я их упоминал совместно чтобы было понятно что речь о адресном выражении для обращения к элементу в соответствии с текстом цитаты из стандарта (пардон - черновика), потому как просто P выглядит куцо. Тут важно то, что вы и другие поняли о чём речь. И да. Нет там чтения самих P/Q. А чтение идёт через них. И чтение объектов вида Base* из объектов вида Derived*.
Цитата Сообщение от zayats80888 Посмотреть сообщение
Azazel-San и hoggy выше приводили примеры "неприятностей".
Покажите конкретно - где.
Цитата Сообщение от zayats80888 Посмотреть сообщение
А С++ вроде позиционируется "типобезопасным"
это уже эпическая патетика. Я же о неявном преобразовании говорю. Их в языке есть. Вон Azazel-San тоже аргументирует "дык ведь нельзя же". И это на вопрос, а почему нельзя? Это бессмысленная трата времени.
0
Mental handicap
 Аватар для Azazel-San
1246 / 624 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
07.01.2020, 00:15
Цитата Сообщение от rat0r Посмотреть сообщение
Потому что доступа через glvalue с типом Y* нет.
А разве &y это не каст к Y*?
Т.е. так:
C++
1
2
3
4
5
6
7
8
9
struct X { virtual void f(); };
struct Y : X { void f() override; };
 
int main() {
  Y   y;
  Y*  yp = &y;
  X** xpp = (X**)&yp;
  (*xpp)->f();
}
Значит строка (*xpp)->f() нарушает strict aliasing rule?
Цитата Сообщение от rat0r Посмотреть сообщение
Я бы не называл это кастом
Ну, ре-интерпретация типов?)
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
07.01.2020, 00:17
вот здесь:
Цитата Сообщение от Azazel-San Посмотреть сообщение
X* xp = &y;
ты сохраняешь в указателе значение объекта, имеющего тип X*
(а не тип Y*)

Цитата Сообщение от Azazel-San Посмотреть сообщение
xp->f();
здесь доступ через указатель xp,
который имеет тип X*
и при этом по факту содержит значение объекта такого же типа X*

поэтому никаких проблем здесь быть не может.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.01.2020, 00:17
Помогаю со студенческими работами здесь

Передача массива в конструктор производного класса
Народ, задача такая: Создать абстрактный класс с виртуальной функцией – норма. Создать производные классы : комплексные ...

Восходящее и нисходящее преобразование (Upcasting and Downcasting)
Посоветуйте литературу по данному вопросу в разрезе С++ ну или простыми словами что это, для чего нужно заранее спасибо

Неявное восходящее преобразование при защищенном/закрытом наследовании
Здравствуйте. Читаю книгу Стивена Прата по C++. Попался непонятный момент: в одной таблице (в таблице 14.1 в 6-й рус. редакции на стр....

Как сложить объект базового класса с объектом производного(наследуемого класса)
Как умножить объект базового класса с объектом производного(наследуемого класса): ozenka - объект базового класса, а ves- производного ...

Почему объект производного класса не видит префиксный оператор из базового класса?
Короче создал я базовый класс с перегруженным префиксным оператором ++. Потом чтоб его затюнинговать, сделал ему производный класс с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru