|
0 / 0 / 0
Регистрация: 20.04.2018
Сообщений: 38
|
|||||||||||
Преобразование ссылки на дочерний класс в ссылку также на дочерний класс28.04.2020, 23:15. Показов 2046. Ответов 19
Метки нет (Все метки)
Имеются 3 класса: Базовый класс Person9 и два производных(дочерних) от него Official9 и Student9
Необходимо через dynamic_cast преобразовать ссылку на класс Official9 в ссылку на класс Student9, помогите пожалуйста как это можно сделать? Пытался напрямую (см. код главной программы), как если бы преобразовывал ссылку на базовый класс в ссылку на дочерний, но в таком случае натыкаюсь на ошибку: "E0434 не удается инициализировать ссылку типа "Official9 & (квалифицируется как неконстантная) со значением типа "Student9" Описание классов:
0
|
|||||||||||
| 28.04.2020, 23:15 | |
|
Ответы с готовыми решениями:
19
Класс млекопитающих: создать дочерний класс кошка, который также характеризуется именем и положением в пространстве Дочерний класс Указатель на дочерний класс |
|
0 / 0 / 0
Регистрация: 20.04.2018
Сообщений: 38
|
|
| 28.04.2020, 23:27 [ТС] | |
![]() понадобилось из-за задания в лабораторке по ООП
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||||||
| 28.04.2020, 23:27 | |||||||
0
|
|||||||
|
0 / 0 / 0
Регистрация: 20.04.2018
Сообщений: 38
|
|
| 28.04.2020, 23:43 [ТС] | |
|
oleg-m1973, Исправил как вы указали, ошибка E0434 пропала, но теперь при компиляция срабатывает обработка исключений и выводится " BAD CAST 1 ", если же убрать try-catch, то появляется ошибка в окне "Microsoft Visual C++ Runtime Library Debug Error!"
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 28.04.2020, 23:45 | ||
|
0
|
||
|
0 / 0 / 0
Регистрация: 20.04.2018
Сообщений: 38
|
|
| 28.04.2020, 23:51 [ТС] | |
|
oleg-m1973, либо я неправильно понял задание и действительно нужно сделать так, как Вы говорите, либо нужно всё-таки каким-то образом реализовать преобразование ссылки на дочерний класс в ссылку также на дочерний класс, но насколько я понял, это сделать невозможно?
Задание в лабораторной так и звучит: Обеспечить преобразование ссылки на класс служащий в ссылку на класс студент
0
|
|
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
| 28.04.2020, 23:53 | |
|
0
|
|
|
0 / 0 / 0
Регистрация: 20.04.2018
Сообщений: 38
|
|||
| 29.04.2020, 00:00 [ТС] | |||
|
IGPIGP,
Добавлено через 50 секунд oleg-m1973, видимо действительно необходимо переделать в этом задании иерархию данных классов, просто в предыдущих заданиях этой лабораторной иерархия должна была быть именно такой, как я описал в начале, то есть базовый Person и два дочерних ему Student и Official. Нужно будет уточнить задание у преподавателя. Спасибо за помощь!
0
|
|||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||||||
| 29.04.2020, 00:21 | |||||||
|
Подозреваю, исследовать такое поведение и было заданием. Единственно, надо сначала преобразовать Official9 -> Person9, а потом Person9 -> Student9
1
|
|||||||
|
Вездепух
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
|
||||||||||||||
| 29.04.2020, 02:03 | ||||||||||||||
dynamic_cast, то преобразование выполнится успешно. А именно: исходная ссылка Official9 & должна ссылаться на public базовый подобъект типа Official9 в составе некоторого большего объекта типа T, у которого также есть и однозначный public базовый подобъект типа Student9. То есть dynamic_cast позволит вам в такой ситуации выполнить cross-cast: "прыгнуть" с одной базы общего потомка типа T на его другую базу.Подчеркиваю: такой dynamic_cast всегда работает "через низ", т.е. через общего потомка T, а не через общего предка.Однако в вашей иерархии классов это преобразование никак не может быть успешным. У вас не нигде не видно такого типа T, являющегося общим потомком. А без этого о таком преобразовании не может быть и речи - вы будете просто получать от dynamic_cast исключения std::bad_cast. То есть пока у вас не появится
dynamic_cast всегда будет завершаться безуспешно.dynamic_cast не требуется. См. выше. Эти классы могут не иметь общего предка вообще.dynamic_cast более "свободны": для этого нужно чтобы они оба входили в состав одного потомка и исходная ссылка ссылалась внутрь такого потомка.
1
|
||||||||||||||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|
| 29.04.2020, 11:01 | |
|
Хотя, конечно удивляет, что вообще можно скомпилировать dynamic_cast из Official9& в Student9& - если эти типы нельзя преобразовать в compile-time, то какой смысл проверять это в рантайме?
1
|
|
|
Комп_Оратор)
|
||
| 29.04.2020, 11:09 | ||
|
0
|
||
|
Вездепух
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
|
||
| 29.04.2020, 11:33 | ||
dynamic_cast должна сводиться лишь к проверкам того, что можно преобразовать в compile-time? Вы, как я понимаю, никогда его ни для чего другого не использовали и для вас полный спектр его возможностей является сюрпризом.dynamic_cast в общем случае базируется на RTTI и может делать особые, чисто RTTI-шные трюки. В частности, dynamic_cast умеет находить most derived object через преобразование к void *. Это уже - новая функциональность, недоступная compile-time кастам. А там где есть возможность находить most derived object, там открываются возможности и для cross-cast через этот most derived object.Опять же, если бы вы знали общего потомка заранее, вы бы смогли преобразовать эти типы в compile-time, двумя кастами: downcast к общему потомку и последующий upcast. Без проверки правильности, разумеется. А dynamic_cast просто делает это за один шаг, плюс выполняет проверку.
0
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
||
| 29.04.2020, 11:41 | ||
|
Но, тем не менее, искренне не понимаю - если указатели указывают на абсолютно разные классы, и их нельзя преобразовать в compile-time при помощи static_cast, то каким образом это можно сделать в рантайме?
0
|
||
|
Вездепух
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
|
||
| 29.04.2020, 12:01 | ||
|
Разница только в том, что для compile-time преобразования вам нужно в мемюсте выполнения каста знать и видеть тип этого общего потомка. А dynamic_cast, благодаря RTTI, имеет возможность это сделать без знания и видения типа этого общего потомка.Вот и вся разница.
0
|
||
|
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
|
|||||||
| 29.04.2020, 12:08 | |||||||
0
|
|||||||
|
Вездепух
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
|
||
| 29.04.2020, 12:24 | ||
|
Где-то на другом конце программы, в другой единице трансляции, Вася Пупкин может создать свой великий ультра-класс, который наследуется одновременно от вашего A и от вашего B. После чего он создаст экземпляр этого великого класса, возьмёт ссылку на базу A и передаст ее вам сюда, в вашу единицу трансляции. И здесь вы будете делать dynamic_cast этой ссылки из A& в B&. И этот dynamic_cast обязан отработать успешно, без выбрасывания исключений, и отработать корректно, несмотря на то, что в этой единице трансляции вы ничего не знаете о великом ультра-классе Васи.Так что смотря только на эти два класса, которые вы привели, или (шире) даже на всю вашу единицу трансляции невозможно сделать никаких выводов о возможности или невозможности такого каста. Предсказать безуспешность каста можно только в том случае, если вы четко видите происхождение исходной ссылки (как в вашем тривиальном примере) и, поэтому, точно знаете, что ни в какой Васин ультра-класс она не ссылается. Но как только происхождение ссылки становится туманным (например, это параметр внешней функции), то никаких предсказаний сделать невозможно. Каст вполне может быть корректным.
0
|
||
| 29.04.2020, 12:24 | |
|
Помогаю со студенческими работами здесь
20
Дочерний класс от QByteArray
Родительский и дочерний класс Родительский и дочерний класс Наследование - дочерний класс Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
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. Пошагово создадим проект для загрузки изображения. . .
|