Странное поведение при множественном наследовании QObject |
Здравствуйте, гость ( Вход | Регистрация )
Странное поведение при множественном наследовании QObject |
aljeshishe |
1.12.2009, 19:52
Сообщение
#1
|
Студент Группа: Новичок Сообщений: 12 Регистрация: 1.12.2009 Пользователь №: 1271 Спасибо сказали: 2 раз(а) Репутация: 0 |
В конце значение с неопределено. Если не наследовать от QObject то все нормально с=1. msvc-2008, qt-4.5.0 |
|
|
Litkevich Yuriy |
1.12.2009, 20:10
Сообщение
#2
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
aljeshishe |
1.12.2009, 20:20
Сообщение
#3
|
Студент Группа: Новичок Сообщений: 12 Регистрация: 1.12.2009 Пользователь №: 1271 Спасибо сказали: 2 раз(а) Репутация: 0 |
|
|
|
BRE |
1.12.2009, 20:55
Сообщение
#4
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
Добавь магическую строку:
|
|
|
Litkevich Yuriy |
1.12.2009, 21:03
Сообщение
#5
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
BRE, ничего не изменилось
Хм, сделал наследование каком к верху, т.е. "А" первый, тогда получаю единичку. |
|
|
aljeshishe |
1.12.2009, 21:07
Сообщение
#6
|
Студент Группа: Новичок Сообщений: 12 Регистрация: 1.12.2009 Пользователь №: 1271 Спасибо сказали: 2 раз(а) Репутация: 0 |
Добавь магическую строку:
Спасибо, как я понял дело в полиморфности QObject. Поясните если не трудно для чего нужна полиморфность класса А. Добавь магическую строку:
|
|
|
BRE |
1.12.2009, 21:09
Сообщение
#7
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
|
|
|
aljeshishe |
1.12.2009, 21:20
Сообщение
#8
|
Студент Группа: Новичок Сообщений: 12 Регистрация: 1.12.2009 Пользователь №: 1271 Спасибо сказали: 2 раз(а) Репутация: 0 |
Спасибо |
|
|
BRE |
1.12.2009, 21:30
Сообщение
#9
|
Профессионал Группа: Участник Сообщений: 1112 Регистрация: 6.3.2009 Из: Ростов-на-Дону Пользователь №: 591 Спасибо сказали: 264 раз(а) Репутация: 44 |
BRE, ничего не изменилось Хм, сделал наследование каком к верху, т.е. "А" первый, тогда получаю единичку. Тут имеет значение порядок наследования. В первом случае в памяти имеем (объект класса B ): int a; <данные QObject> int b; Во втором случае: <данные QObject> int a; int b; Т.е. смещение переменной a будет разным и компилятор не может правильно рассчитать смещение при обычном привидении типа (void* -> A*). А вот если указатель сначала привести к B*, а потом к A*, то все будет нормально. |
|
|
ViGOur |
1.12.2009, 21:43
Сообщение
#10
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Для того, что-бы компилятор смог правильно вычислить смещение до переменной a. Точней будет, что ключевое слово virtual добавляет в класс А таблицу виртуальных методов (vtable), благодаря чему при приведении класса B к классу А смещение считается правильно. А без этого ключевого слова класс А был без этой таблицы. Если я правильно все понял! А вот и более точный ответ: Цитата Обычно компилятор создает отдельную vtable для каждого класса. После создания объекта указатель на эту vtable, называемый виртуальный табличный указатель или vpointer, добавляется как скрытый член данного объекта (а зачастую как первый член). Компилятор также генерирует "скрытый" код в конструкторе каждого класса для инициализации vpointer'ов его объектов адресами соответствующей vtable.
|
|
|
Текстовая версия | Сейчас: 27.12.2024, 4:24 |