crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

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


Последние 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 Текстовая версия Сейчас: 28.3.2024, 15:40