Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
2784 / 1937 / 570
Регистрация: 05.06.2014
Сообщений: 5,602

Изменение значения указателя при преобразовании типов

24.01.2018, 07:57. Показов 1913. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс Child, унаследованный от класса Parent. Наследование обычное, а не множественное. И Parent, и Child имеют виртуальные функции. Гарантируется ли что при преобразовании Child* в Parent* значение указателя не изменится? То есть, (void*)childPointer==(void*)(Parent*)chi ldPointer.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
24.01.2018, 07:57
Ответы с готовыми решениями:

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ...
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... как сделать...

Странное поведение при преобразовании типов
Доброго времени суток! Помогал товарищу написать простенькую программу. Задача состояла в том, чтобы при введенном дробном числе...

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

10
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
24.01.2018, 10:26
Вообще было бы довольно странно, если бы значение указателя менялось. У вас есть какие-то аргументы, чтобы так считать?
Указатель вседа указывает на начало класса. Не зависимо от наличия в нем виртуальных функций. Просто в классе с виртуалками появляется таблица этих самых виртуальных функций, которая, если не изменяет память, помещается в начало, сдвигая смещение первого члена класса. А вот без виртуальных функций указатель будет четко попадать на первый член класса. Хотя, это детали реализации конкретного компилятора и в целом это может не совпадать с тем, что я вам описал.
Насколько помнится, приведение к void - это всегда UB и за результат компиль не отвечает. Вся ответственность перекладывается на программиста.
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,033
Записей в блоге: 1
24.01.2018, 10:37
Лучший ответ Сообщение было отмечено DrOffset как решение

Решение

Цитата Сообщение от Renji Посмотреть сообщение
Гарантируется ли что при преобразовании Child* в Parent* значение указателя не изменится?
The order in which the base class subobjects are allocated in the most derived object (4.5) is unspecified.
1
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
24.01.2018, 10:40
Цитата Сообщение от jahdjkhasjdhjah Посмотреть сообщение
Указатель вседа указывает на начало класса
Разговор про экземпляры
Цитата Сообщение от jahdjkhasjdhjah Посмотреть сообщение
которая, если не изменяет память, помещается в начало, сдвигая смещение первого члена класса.
Серьезно, в каждом экземпляре отдельная таблица?
0
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
24.01.2018, 11:30
Цитата Сообщение от alex white Посмотреть сообщение
Серьезно, в каждом экземпляре отдельная таблица?
Где-то было написано, что я шучу? Вообще, это зависит от конкретной реализации конкретным компилятором. Вполне может быть, что в вашем случае, это не так.
Цитата Сообщение от alex white Посмотреть сообщение
Разговор про экземпляры
А вы умеете создавать указатели на определение класса?
0
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
24.01.2018, 11:32
Цитата Сообщение от jahdjkhasjdhjah Посмотреть сообщение
Вообще, это зависит от конкретной реализации конкретным компилятором.
Какой компилятор будет пихать целую таблицу в объект, если она идентична для всех объектов одного класса?
Цитата Сообщение от jahdjkhasjdhjah Посмотреть сообщение
А вы умеете создавать указатели на определение класса?
Нет. Но это не дает мне говорить "указатель на класс", "начало класса".
0
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
24.01.2018, 11:36
Цитата Сообщение от alex white Посмотреть сообщение
Какой компилятор будет пихать целую таблицу в объект, если она идентична для всех объектов одного класса?
https://ru.wikipedia.org/wiki/... 0%BE%D0%B2

Если эта таблица не более 2-х-трех строк, то почему бы нет? По вашему указатель на эту таблицу эффективнее сработает?
Цитата Сообщение от alex white Посмотреть сообщение
Нет. Но это не дает мне говорить "указатель на класс".
Тем не менее, это дает вам говорить с высока, как будто вы обладаете какими-то сокровенными знаниями и по происхождению из королевской семьи.
0
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
24.01.2018, 11:39
Цитата Сообщение от jahdjkhasjdhjah Посмотреть сообщение
https://ru.wikipedia.org/wiki/%D0%A2...B4%D0%BE%D0%B2
Ну и? Где вы увидели ТВМ в объекте, а не указатель на неё? Или ТВМ и указатель на ТВМ это то же самое, ровно как объект и класс?
Цитата Сообщение от jahdjkhasjdhjah Посмотреть сообщение
Тем не менее, это дает вам говорить с высока, как будто вы обладаете какими-то сокровенными знаниями и по происхождению из королевской семьи.
Ваши галлюцинации оставьте при себе.
0
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
24.01.2018, 11:52
Цитата Сообщение от alex white Посмотреть сообщение
Ну и? Где вы увидели ТВМ в объекте, а не указатель на неё?
ТЫ просмотрел главное:
В стандартах C++ нет четкого определения как должна реализовываться динамическая координация
Существует множество различных способов реализации подобного динамического связывания
и ТВОЕ ЕДИНСТВЕННОЕ знание, как это можно реализовать вовсе НЕ ОЗНАЧАЕТ, что оно ИСТИННО ВСЕГДА. Чао, крошка!
0
277 / 226 / 93
Регистрация: 27.06.2016
Сообщений: 639
24.01.2018, 12:00
jahdjkhasjdhjah,
Просто в классе с виртуалками появляется таблица этих самых виртуальных функций, которая, если не изменяет память, помещается в начало, сдвигая смещение первого члена класса
Зато уверенно сказануть что-то такое это вам право дает. А потом робко добавить что-то там про реализацию. Я исхожу из обычной логики, из которой следует, что инлайнить ТВМ нет никакого смысла, ну максимум если там один метод, и то не факт... Гуляйте.
0
73 / 86 / 40
Регистрация: 02.11.2017
Сообщений: 379
24.01.2018, 15:00
Цитата Сообщение от alex white Посмотреть сообщение
Зато уверенно сказануть
Цитата Сообщение от jahdjkhasjdhjah Посмотреть сообщение
если не изменяет память
Цитата Сообщение от alex white Посмотреть сообщение
А потом робко добавить
Извини, что робко ответил.
В следующий раз попытаюсь побрутальнее. )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
24.01.2018, 15:00
Помогаю со студенческими работами здесь

Изменение значения указателя
Здравствуйте В коде приведена функция, которая при помощи указателей считывает размер массива и его элементы из файла блокнота. Почему...

C++ о преобразовании типов
Привет всем! Начал этот суперзык изучать и столкнулся с неразрешимой задачей для меня. //Провайдер вам говорит, что суммарная...

Ошибка в преобразовании типов
Здравствуйте. Я написал программу, которая преобразует int в char через указатель. Программа работает, но криво. Например при вводе числа...

Почему при выводе указателя получаем для char - значение по адресу, а для других типов - адрес
Есть следующий код. Результат работы этой программы представлен на рисунке. Почему при выводе указателя для char возвращается значение, а...

Найти предельные значения для целочисленных типов. Не использовать заранее определенные константы границ типов.
Буду благодарен! Найти предельные значения для целочисленных типов. Не использовать заранее определенные константы границ типов.


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
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