crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )


  Ответ в Странное поведение при множественном наследовании QObject
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
kwisp Дата 4.12.2009, 12:18
  Litkevich Yuriy,
в данном примере ты пытался его заставть преобразовать из типа void* !
dynamic_cast служит не только дял преобразования указателей и ссылок с l-value но и для определения возможно ли преобразование в случае неудачи с указателями возвращает 0 в слкчае неудачи с сылками выкидывает исключение.
Litkevich Yuriy Дата 3.12.2009, 18:36
  kwisp, т.е. в обратную сторону он не преобразует (как в данном примере) от наследника к базовому классу?
kwisp Дата 3.12.2009, 18:24
 
Цитата(Litkevich Yuriy @ 3.12.2009, 16:06) *
вроде синтаксис верный

Цитата
оператор dynamic_cast поддерживает преобразования типов во время выполнения, обеспечивая безопасную навигацию по иерархии классов. Он позволяет трансформировать указатель на базовый класс в указатель на производный от него, а также преобразовать l-значение, ссылающееся на базовый класс, в ссылку на производный, но только в том случае, если это завершится успешно;


Однако для получения информации о типе производного класса операнд любого из операторов dynamic_cast должен иметь тип класса, в котором есть хотя бы одна виртуальная функция.
AD Дата 3.12.2009, 17:31
  Я не могу так. Народ, будьте внимательнее.
"Странное поведение при множественном наследовании QObject" вместо
"Странное повдение при множественном наследовании QObject"

P.S. Как то следите хотя бы за названиями тем. Про сообщения я молчу.... Извините, если надоедаю по пустякам....
Litkevich Yuriy Дата 3.12.2009, 16:06
  вот так:
Цитата
main.cpp:36: error: cannot dynamic_cast `p' (of type `void*') to type `class A*' (source is not a pointer to class)

на строчку:
A *a = dynamic_cast<A*>(p);


вроде синтаксис верный
kwisp Дата 3.12.2009, 15:58
  Litkevich Yuriy,
а как послал?
Litkevich Yuriy Дата 3.12.2009, 15:29
 
Цитата(kwisp @ 3.12.2009, 14:38) *
как верно пользоваться dynamic_cast<>()
я пробовал в его коде такое приведение, компилер меня сразу послал, а вто static_cast и reinterpret_cast работают
kwisp Дата 3.12.2009, 11:38
  поддерживаю fgr10, не было бы
void* p = new B;
A* a = (A*)p;

не было бы проблем:) кстати в куче учебников и книг просто кричат о том что так делать нельзя.
но с другой стороны не было бы и такой интересной и познавательной темы:)
еще в данном вопросе полезно узать как верно пользоваться dynamic_cast<>(), ведь она тоже требует наличия виртуальной таблицы.
aljeshishe Дата 2.12.2009, 21:48
  Посмотрел как хранится в памяти класс, наследующий виртуально от полиморфного класса и невиртуально от обычного:
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 вычисляются верно
Litkevich Yuriy Дата 2.12.2009, 20:54
 
Цитата(aljeshishe @ 2.12.2009, 21:18) *
виртуальное наследование
никогда не слышал про такое
Цитата(aljeshishe @ 2.12.2009, 21:18) *
lass User : virtual public QObject, public Node
За статью спасибо.
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 16.7.2025, 14:09