Странное поведение при множественном наследовании QObject |
Здравствуйте, гость ( Вход | Регистрация )
Странное поведение при множественном наследовании QObject |
aljeshishe |
2.12.2009, 21:48
Сообщение
#21
|
Студент Группа: Новичок Сообщений: 12 Регистрация: 1.12.2009 Пользователь №: 1271 Спасибо сказали: 2 раз(а) Репутация: 0 |
Посмотрел как хранится в памяти класс, наследующий виртуально от полиморфного класса и невиртуально от обычного:
class User : virtual public QObject, public Node 1. Данные Node 2. Адрес виртуального класса QObject - 4 байта 3. Данные User 4. vtable QObject - 4 байта 5. Данные QObject Таким образом User не содержит первым байтом vtable QObect'a (как при обычном наследовании), поэтому указатели при приведении void* ->Node вычисляются верно |
|
|
kwisp |
3.12.2009, 11:38
Сообщение
#22
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
поддерживаю fgr10, не было бы
не было бы проблем:) кстати в куче учебников и книг просто кричат о том что так делать нельзя. но с другой стороны не было бы и такой интересной и познавательной темы:) еще в данном вопросе полезно узать как верно пользоваться dynamic_cast<>(), ведь она тоже требует наличия виртуальной таблицы. |
|
|
Litkevich Yuriy |
3.12.2009, 15:29
Сообщение
#23
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
kwisp |
3.12.2009, 15:58
Сообщение
#24
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
Litkevich Yuriy,
а как послал? |
|
|
Litkevich Yuriy |
3.12.2009, 16:06
Сообщение
#25
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
вот так:
Цитата main.cpp:36: error: cannot dynamic_cast `p' (of type `void*') to type `class A*' (source is not a pointer to class) на строчку:
вроде синтаксис верный |
|
|
AD |
3.12.2009, 17:31
Сообщение
#26
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
Я не могу так. Народ, будьте внимательнее.
"Странное поведение при множественном наследовании QObject" вместо "Странное повдение при множественном наследовании QObject" P.S. Как то следите хотя бы за названиями тем. Про сообщения я молчу.... Извините, если надоедаю по пустякам.... Сообщение отредактировал AD - 3.12.2009, 17:33 |
|
|
kwisp |
3.12.2009, 18:24
Сообщение
#27
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
вроде синтаксис верный Цитата оператор dynamic_cast поддерживает преобразования типов во время выполнения, обеспечивая безопасную навигацию по иерархии классов. Он позволяет трансформировать указатель на базовый класс в указатель на производный от него, а также преобразовать l-значение, ссылающееся на базовый класс, в ссылку на производный, но только в том случае, если это завершится успешно; Однако для получения информации о типе производного класса операнд любого из операторов dynamic_cast должен иметь тип класса, в котором есть хотя бы одна виртуальная функция. |
|
|
Litkevich Yuriy |
3.12.2009, 18:36
Сообщение
#28
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
kwisp, т.е. в обратную сторону он не преобразует (как в данном примере) от наследника к базовому классу?
|
|
|
kwisp |
4.12.2009, 12:18
Сообщение
#29
|
астарожна ынтжинэр Группа: Участник Сообщений: 1404 Регистрация: 26.11.2008 Из: ТаганрогРодинаЧехова Пользователь №: 435 Спасибо сказали: 113 раз(а) Репутация: 23 |
Litkevich Yuriy,
в данном примере ты пытался его заставть преобразовать из типа void* ! dynamic_cast служит не только дял преобразования указателей и ссылок с l-value но и для определения возможно ли преобразование в случае неудачи с указателями возвращает 0 в слкчае неудачи с сылками выкидывает исключение. Сообщение отредактировал kwisp - 4.12.2009, 12:20 |
|
|
Текстовая версия | Сейчас: 29.3.2024, 8:02 |