|
0 / 0 / 0
Регистрация: 20.04.2018
Сообщений: 38
|
|||||||||||
Преобразование ссылки на дочерний класс в ссылку также на дочерний класс28.04.2020, 23:15. Показов 2085. Ответов 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
|
|||||||
|
Вездепух
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,296
|
||||||||||||||
| 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
|
||
|
Вездепух
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,296
|
||
| 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
|
||
|
Вездепух
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,296
|
||
| 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
|
|||||||
|
Вездепух
13202 / 6837 / 1822
Регистрация: 18.10.2014
Сообщений: 17,296
|
||
| 29.04.2020, 12:24 | ||
|
Где-то на другом конце программы, в другой единице трансляции, Вася Пупкин может создать свой великий ультра-класс, который наследуется одновременно от вашего A и от вашего B. После чего он создаст экземпляр этого великого класса, возьмёт ссылку на базу A и передаст ее вам сюда, в вашу единицу трансляции. И здесь вы будете делать dynamic_cast этой ссылки из A& в B&. И этот dynamic_cast обязан отработать успешно, без выбрасывания исключений, и отработать корректно, несмотря на то, что в этой единице трансляции вы ничего не знаете о великом ультра-классе Васи.Так что смотря только на эти два класса, которые вы привели, или (шире) даже на всю вашу единицу трансляции невозможно сделать никаких выводов о возможности или невозможности такого каста. Предсказать безуспешность каста можно только в том случае, если вы четко видите происхождение исходной ссылки (как в вашем тривиальном примере) и, поэтому, точно знаете, что ни в какой Васин ультра-класс она не ссылается. Но как только происхождение ссылки становится туманным (например, это параметр внешней функции), то никаких предсказаний сделать невозможно. Каст вполне может быть корректным.
0
|
||
| 29.04.2020, 12:24 | |
|
Помогаю со студенческими работами здесь
20
Дочерний класс от QByteArray
Родительский и дочерний класс Родительский и дочерний класс Наследование - дочерний класс Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
| Опции темы | |
|
|
Новые блоги и статьи
|
|||
|
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут
Суть:
- Группа наркоманов из 10 человек.
- Только один инфицирован ВИЧ.
- Колются одной иглой.
- Колются раз в день.
- Колются последовательно через. . .
|
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
|
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
|
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . .
а удачный момент так и не приходит.
|
|
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица.
Задача: зафиксировать три левых колонки в отчете.
Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка)
/ / . . .
|
Настройки VS Code
Loafer 13.04.2026
{
"cmake. configureOnOpen": false,
"diffEditor. ignoreTrimWhitespace": true,
"editor. guides. bracketPairs": "active",
"extensions. ignoreRecommendations": true,
. . .
|
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2.
Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива.
Было так:. . .
|
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2.
Задача: реализовать контроль корректности заполнения дат назначения. . .
|