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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] Виртуальное наследование для разрешения наследования ромбовидного  (Прочитано 4174 раз)
Yegor
Гость
« : Март 13, 2018, 19:52 »

Всем здравствуйте!

У меня есть диалог - потомок QDialog
И есть класс-примесь, который также наследуется для этого диалога. И примесь мне обязательно нужна наследником от QObject.

Если оба этих класса наследовать в мой диалог - то возникает ситуация с ромбовидным наследованием.


Примесь:
Код
C++ (Qt)
class MyMixing: public QObject
{}

Диалог:
Код
C++ (Qt)
class MyDialog: public QDialog, protected MyMixing
{}

Где проблема - в классе QObject, который есть во всех наследуемых классах.

Я знаю, что для решения такой проблемы, в стандарте С++ предусмотрена технология виртуального наследования. Пожалуйста, подскажите, какой код добавить для использовании этой технологии.

Спасибо!
« Последнее редактирование: Март 14, 2018, 11:16 от Yegor » Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #1 : Март 13, 2018, 20:20 »

Я знаю, что для решения такой проблемы, в стандарте С++ предусмотрена технология виртуального наследования. Пожалуйста, подскажите, какой код добавить для использовании этой технологии.

Никакой. Чтобы вы смогли задействовать механизм виртуального наследования, нужно чтобы в иерархии QDialog было виртуальное наследование от QObject ( QDialog : public QWidget : public virtual QObject). Но это не так, и никто такое виртуальное наследование делать не будет. Так что придётся вам что-то другое придумать Улыбающийся.
Записан

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

Сообщений: 3258


Просмотр профиля
« Ответ #2 : Март 13, 2018, 21:50 »

Еще MOC не умеет в множественное наследование от QObject.
Можно посмотреть на AggregationSystem в QtCreator, там что-то подобное - есть связанные объекты, которые можно "кастить" друг в друга.
Записан
ssoft
Программист
*****
Offline Offline

Сообщений: 579


Просмотр профиля
« Ответ #3 : Март 14, 2018, 08:07 »

Можете сделать абстрактный интерфейс и использовать агрегацию

Код
C++ (Qt)
class MixingInterface
{
};
 
class MyMixing
   : public QObject
   , public MixingInterface
{};
 
class MyDialog
   : public QDialog
   , protected MixingInterface
{
   MyMixing m_mixing;
};
 
Записан
Yegor
Гость
« Ответ #4 : Март 14, 2018, 11:15 »

Понятно. Спасибо за информацию!
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #5 : Март 15, 2018, 16:25 »

И примесь мне обязательно нужна наследником от QObject.
Простой вариант - примесь хранит указатель на QObject - гораздо лучше
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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