powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос о приведении типов
13 сообщений из 13, страница 1 из 1
Вопрос о приведении типов
    #33202198
ils
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ils
Гость
Си++ начал ковырять только недавно и возник такой вопрос:
например (СиБилдер, VCL):

Код: plaintext
1.
2.
3.
4.
TLabel* Label1; 
  // ...
  TButton* btn33 = (TButton*)Label1;
   btn33->Caption = "typecast";
   
Такое разрешается
Теперь Label1 имеет Caption "typecast"
TButton и TLabel имеют общего предка со свойством Caption - т.е. здесь имеет место то, что называется перекрестным приведением? я прав или нет?


А здесь компилятор выдает ошибку - мол этого делать низзя
Код: plaintext
TButton* btn55 = static_cast<TButton*>(Label1);
Объясните плиз, в чем отличие между этими двумя вариантами, т.е. что происходит при первом, а что при втором способе приведения
Буду очень признателен
...
Рейтинг: 0 / 0
Вопрос о приведении типов
    #33202223
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilsСи++ начал ковырять только недавно и возник такой вопрос:
например (СиБилдер, VCL):

Код: plaintext
1.
2.
3.
4.
TLabel* Label1; 
  // ...
  TButton* btn33 = (TButton*)Label1;
   btn33->Caption = "typecast";
   
Такое разрешается
Теперь Label1 имеет Caption "typecast"
TButton и TLabel имеют общего предка со свойством Caption - т.е. здесь имеет место то, что называется перекрестным приведением? я прав или нет?


А здесь компилятор выдает ошибку - мол этого делать низзя
Код: plaintext
TButton* btn55 = static_cast<TButton*>(Label1);
Объясните плиз, в чем отличие между этими двумя вариантами, т.е. что происходит при первом, а что при втором способе приведения
Буду очень признателен

Общего предка они имеют, но не один из них предком другого не является, следовательно приводить таким образом указатель нельзя. Работает это случайно, посколько дорматы данных у двух объектов чедесным образом совпадают.
Надо всегда использовать второй вариант либо dynamic_cast - это более безопасное приведение типов в стиле С++. Первый вариант - это приведение типов в стиле С, и считается устаревшим.
Он для приведения одного типа к другому просто выполняет двоичное копирование данных.
...
Рейтинг: 0 / 0
Вопрос о приведении типов
    #33202280
ils
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ils
Гость
спасибо за ответ, но снова вопрос

Сергей Ильич
Общего предка они имеют, но не один из них предком другого не является, следовательно приводить таким образом указатель нельзя

У Страуструпа написано, что есть такая штука, как приведение между производными классами одного базового класса (кросскаст) - в каком случае данное явление имеет смысл?
...
Рейтинг: 0 / 0
Вопрос о приведении типов
    #33202283
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На самом деле неправда, что приведение типа ((type) expr) "просто выполняет двоичное копирование данных". Никакого копирования оно не выполняет.
Оно выполняет обычный static_cast или const_cast, если это возможно (компилятор об этом знает), либо, если это невозможно, выполняется что-то типа (в случае указателей) :
((type*)((void*) expr))

Конечно, в стандарте можно найти более строгое определение операции, но в принципе все выглядит именно так.
...
Рейтинг: 0 / 0
Вопрос о приведении типов
    #33202316
ils
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ils
Гость
TButton* btn33 = (TButton*)Label1;
btn33->Caption = "typecast";

Можно ли сказать, что в данном случае произошло усечение до базового класса?
...
Рейтинг: 0 / 0
Вопрос о приведении типов
    #33202423
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У Страуструпа написано, что есть такая штука, как приведение между производными классами одного базового класса (кросскаст) - в каком случае данное явление имеет смысл?

А попадробнее можно? Где вы такое прочли?
...
Рейтинг: 0 / 0
Вопрос о приведении типов
    #33202526
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivНа самом деле неправда, что приведение типа ((type) expr) "просто выполняет двоичное копирование данных".
По - моему C-Style cast это reinterpret_cast + const_cast, а reinterpret_cast - это платфотменно - зависимый каст, то есть перенос битов один-в-один.
...
Рейтинг: 0 / 0
Вопрос о приведении типов
    #33202530
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей Ильич, откуда и куда ты предлагаешь операции приведения типа переносить биты (байты)?
Я в упор не понимаю.
...
Рейтинг: 0 / 0
Вопрос о приведении типов
    #33202534
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilsTButton* btn33 = (TButton*)Label1;
btn33->Caption = "typecast";

Можно ли сказать, что в данном случае произошло усечение до базового класса?
А что будет если ты вызовеш виртуальный метод, впервые определенный в классе TButton? Объект класса TLabel ведь не будет содержать нужный pVtable.
...
Рейтинг: 0 / 0
Вопрос о приведении типов
    #33202544
Фотография Сергей Ильич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivСергей Ильич, откуда и куда ты предлагаешь операции приведения типа переносить биты (байты)?
Я в упор не понимаю.
Взять 32 бита (указатель-на-объект-класса-TLabel) и дать им новый смысл (указатель-на-объект-класса-TButton).
...
Рейтинг: 0 / 0
Вопрос о приведении типов
    #33202545
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ilsTButton* btn33 = (TButton*)Label1;
btn33->Caption = "typecast";

Можно ли сказать, что в данном случае произошло усечение до базового класса?
Нельзя. Можно сказать, что в данном случае выполнено недопустимое преобразование типов (указателей).
...
Рейтинг: 0 / 0
Вопрос о приведении типов
    #33202626
ils
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ils
Гость
Сергей Ильич ilsTButton* btn33 = (TButton*)Label1;
btn33->Caption = "typecast";

Можно ли сказать, что в данном случае произошло усечение до базового класса?
А что будет если ты вызовеш виртуальный метод, впервые определенный в классе TButton? Объект класса TLabel ведь не будет содержать нужный pVtable.

Уловил, сенкс.

funikovyuriУ Страуструпа написано, что есть такая штука, как приведение между производными классами одного базового класса (кросскаст) - в каком случае данное явление имеет смысл?

А попадробнее можно? Где вы такое прочли?

Б.Страуструп
Язык программирования С++, спец. изд ; "Издательство БИНОМ" - "Невский диалект", 2001 г.
глава 15.4 Информация о типе на этапе выполнения
...
Рейтинг: 0 / 0
Вопрос о приведении типов
    #33208828
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей ИльичВзять 32 бита (указатель-на-объект-класса-TLabel) и дать им новый смысл (указатель-на-объект-класса-TButton).
И где ж тут куда чего переносится ?
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос о приведении типов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]