Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Вопрос о приведении типов / 13 сообщений из 13, страница 1 из 1
04.08.2005, 16:29
    #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
04.08.2005, 16:37
    #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
04.08.2005, 16:56
    #33202280
ils
ils
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о приведении типов
спасибо за ответ, но снова вопрос

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

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

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

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

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

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

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

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

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

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

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

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


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