|
|
|
Вопрос о приведении типов
|
|||
|---|---|---|---|
|
#18+
Си++ начал ковырять только недавно и возник такой вопрос: например (СиБилдер, VCL): Код: plaintext 1. 2. 3. 4. Теперь Label1 имеет Caption "typecast" TButton и TLabel имеют общего предка со свойством Caption - т.е. здесь имеет место то, что называется перекрестным приведением? я прав или нет? А здесь компилятор выдает ошибку - мол этого делать низзя Код: plaintext Буду очень признателен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2005, 16:29 |
|
||
|
Вопрос о приведении типов
|
|||
|---|---|---|---|
|
#18+
ilsСи++ начал ковырять только недавно и возник такой вопрос: например (СиБилдер, VCL): Код: plaintext 1. 2. 3. 4. Теперь Label1 имеет Caption "typecast" TButton и TLabel имеют общего предка со свойством Caption - т.е. здесь имеет место то, что называется перекрестным приведением? я прав или нет? А здесь компилятор выдает ошибку - мол этого делать низзя Код: plaintext Буду очень признателен Общего предка они имеют, но не один из них предком другого не является, следовательно приводить таким образом указатель нельзя. Работает это случайно, посколько дорматы данных у двух объектов чедесным образом совпадают. Надо всегда использовать второй вариант либо dynamic_cast - это более безопасное приведение типов в стиле С++. Первый вариант - это приведение типов в стиле С, и считается устаревшим. Он для приведения одного типа к другому просто выполняет двоичное копирование данных. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2005, 16:37 |
|
||
|
Вопрос о приведении типов
|
|||
|---|---|---|---|
|
#18+
спасибо за ответ, но снова вопрос Сергей Ильич Общего предка они имеют, но не один из них предком другого не является, следовательно приводить таким образом указатель нельзя У Страуструпа написано, что есть такая штука, как приведение между производными классами одного базового класса (кросскаст) - в каком случае данное явление имеет смысл? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2005, 16:56 |
|
||
|
Вопрос о приведении типов
|
|||
|---|---|---|---|
|
#18+
На самом деле неправда, что приведение типа ((type) expr) "просто выполняет двоичное копирование данных". Никакого копирования оно не выполняет. Оно выполняет обычный static_cast или const_cast, если это возможно (компилятор об этом знает), либо, если это невозможно, выполняется что-то типа (в случае указателей) : ((type*)((void*) expr)) Конечно, в стандарте можно найти более строгое определение операции, но в принципе все выглядит именно так. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2005, 16:58 |
|
||
|
Вопрос о приведении типов
|
|||
|---|---|---|---|
|
#18+
TButton* btn33 = (TButton*)Label1; btn33->Caption = "typecast"; Можно ли сказать, что в данном случае произошло усечение до базового класса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2005, 17:08 |
|
||
|
Вопрос о приведении типов
|
|||
|---|---|---|---|
|
#18+
У Страуструпа написано, что есть такая штука, как приведение между производными классами одного базового класса (кросскаст) - в каком случае данное явление имеет смысл? А попадробнее можно? Где вы такое прочли? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2005, 17:43 |
|
||
|
Вопрос о приведении типов
|
|||
|---|---|---|---|
|
#18+
MasterZivНа самом деле неправда, что приведение типа ((type) expr) "просто выполняет двоичное копирование данных". По - моему C-Style cast это reinterpret_cast + const_cast, а reinterpret_cast - это платфотменно - зависимый каст, то есть перенос битов один-в-один. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2005, 18:21 |
|
||
|
Вопрос о приведении типов
|
|||
|---|---|---|---|
|
#18+
Сергей Ильич, откуда и куда ты предлагаешь операции приведения типа переносить биты (байты)? Я в упор не понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2005, 18:23 |
|
||
|
Вопрос о приведении типов
|
|||
|---|---|---|---|
|
#18+
ilsTButton* btn33 = (TButton*)Label1; btn33->Caption = "typecast"; Можно ли сказать, что в данном случае произошло усечение до базового класса? А что будет если ты вызовеш виртуальный метод, впервые определенный в классе TButton? Объект класса TLabel ведь не будет содержать нужный pVtable. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2005, 18:24 |
|
||
|
Вопрос о приведении типов
|
|||
|---|---|---|---|
|
#18+
MasterZivСергей Ильич, откуда и куда ты предлагаешь операции приведения типа переносить биты (байты)? Я в упор не понимаю. Взять 32 бита (указатель-на-объект-класса-TLabel) и дать им новый смысл (указатель-на-объект-класса-TButton). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2005, 18:28 |
|
||
|
Вопрос о приведении типов
|
|||
|---|---|---|---|
|
#18+
ilsTButton* btn33 = (TButton*)Label1; btn33->Caption = "typecast"; Можно ли сказать, что в данном случае произошло усечение до базового класса? Нельзя. Можно сказать, что в данном случае выполнено недопустимое преобразование типов (указателей). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2005, 18:28 |
|
||
|
Вопрос о приведении типов
|
|||
|---|---|---|---|
|
#18+
Сергей Ильич ilsTButton* btn33 = (TButton*)Label1; btn33->Caption = "typecast"; Можно ли сказать, что в данном случае произошло усечение до базового класса? А что будет если ты вызовеш виртуальный метод, впервые определенный в классе TButton? Объект класса TLabel ведь не будет содержать нужный pVtable. Уловил, сенкс. funikovyuriУ Страуструпа написано, что есть такая штука, как приведение между производными классами одного базового класса (кросскаст) - в каком случае данное явление имеет смысл? А попадробнее можно? Где вы такое прочли? Б.Страуструп Язык программирования С++, спец. изд ; "Издательство БИНОМ" - "Невский диалект", 2001 г. глава 15.4 Информация о типе на этапе выполнения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.08.2005, 19:11 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33202526&tid=2032913]: |
0ms |
get settings: |
6ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
57ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
41ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 338ms |

| 0 / 0 |
