Russian Qt Forum
Май 03, 2024, 07:54 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Использование dynamic-cast  (Прочитано 13120 раз)
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #15 : Июнь 01, 2017, 13:20 »

Так а что угадывать? Улыбающийся
Я же выше написал, что c++ преобразование в отличии от pure c делает смещение с учётом порядка наследования.

То, что вы оказались неправы:)
Я тоже думал, что берется адрес А, но это не так:
Код:
    qDebug() << quintptr(&d);
    qDebug() << quintptr(bp);
    qDebug() << quintptr(ap);

Код:
140735028670000
140735028670000
140735028670008
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #16 : Июнь 01, 2017, 13:21 »

Виртуальное наследование лежит последним??

В данном случае, да. Интересно, как в случае множественного.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #17 : Июнь 01, 2017, 13:26 »

В данном случае, да. Интересно, как в случае множественного.

Да, все кладутся в конец в порядке наследования.

Код:
class D : virtual public A, virtual private B, private C

Код:
140730504186864 // d
140730504186872 // a
140730504186880 // b
140730504186864 // c

Ну и да:
Код:
class D : virtual public A, private B // сайд-каст не работает
class D : virtual public A, protected B // сайд-каст не работает
class D : virtual public A, public B // сайд-каст работает
« Последнее редактирование: Июнь 01, 2017, 13:28 от Авварон » Записан
__Heaven__
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2130



Просмотр профиля
« Ответ #18 : Июнь 01, 2017, 13:30 »

Цитировать
Да, все кладутся в конец в порядке наследования.
Точно? Я вижу несколько другую картину.
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #19 : Июнь 01, 2017, 13:59 »

Цитировать
Да, все кладутся в конец в порядке наследования.
Точно? Я вижу несколько другую картину.

Думаю не стоит на этом заморачиваться. Разные компиляторы могут по разному vtable и данные объектов создавать и хранить, это уже их головная боль. Разработчикам главное понимать, как dynamic_cast по стандарту работать должен.
Записан

Пока сам не сделаешь...
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Июнь 01, 2017, 14:41 »

Так а что угадывать? Улыбающийся
Я же выше написал, что c++ преобразование в отличии от pure c делает смещение с учётом порядка наследования.
С-каст сделает то же самое для приведения "по вертикали", вот sidecross оно не потянет

Думаю не стоит на этом заморачиваться. Разные компиляторы могут по разному vtable и данные объектов создавать и хранить, это уже их головная боль. Разработчикам главное понимать, как dynamic_cast по стандарту работать должен.
Согласен, любое приведение легко разложить на "вертикальные", они должны работать железно. Ни к чему искать ненужных приключений
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #21 : Июнь 01, 2017, 14:43 »

По стандарту side cast разрешен. Например, можно кастить один интерфейс к другому.
Или проверять, реализует ли данный QObject такой-то интерфейс.
Записан
Yegor
Гость
« Ответ #22 : Июнь 02, 2017, 16:16 »

Всем спасибо, кто откликнулся!
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 23.