Russian Qt Forum

Программирование => С/C++ => Тема начата: Yegor от Март 13, 2018, 19:52



Название: [РЕШЕНО] Виртуальное наследование для разрешения наследования ромбовидного
Отправлено: Yegor от Март 13, 2018, 19:52
Всем здравствуйте!

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

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


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

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

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

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

Спасибо!


Название: Re: Виртуальное наследование для разрешения наследования ромбовидного
Отправлено: ViTech от Март 13, 2018, 20:20
Я знаю, что для решения такой проблемы, в стандарте С++ предусмотрена технология виртуального наследования. Пожалуйста, подскажите, какой код добавить для использовании этой технологии.

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


Название: Re: Виртуальное наследование для разрешения наследования ромбовидного
Отправлено: Авварон от Март 13, 2018, 21:50
Еще MOC не умеет в множественное наследование от QObject.
Можно посмотреть на AggregationSystem в QtCreator, там что-то подобное - есть связанные объекты, которые можно "кастить" друг в друга.


Название: Re: Виртуальное наследование для разрешения наследования ромбовидного
Отправлено: ssoft от Март 14, 2018, 08:07
Можете сделать абстрактный интерфейс и использовать агрегацию

Код
C++ (Qt)
class MixingInterface
{
};
 
class MyMixing
   : public QObject
   , public MixingInterface
{};
 
class MyDialog
   : public QDialog
   , protected MixingInterface
{
   MyMixing m_mixing;
};
 


Название: Re: Виртуальное наследование для разрешения наследования ромбовидного
Отправлено: Yegor от Март 14, 2018, 11:15
Понятно. Спасибо за информацию!


Название: Re: [РЕШЕНО] Виртуальное наследование для разрешения наследования ромбовидного
Отправлено: Igors от Март 15, 2018, 16:25
И примесь мне обязательно нужна наследником от QObject.
Простой вариант - примесь хранит указатель на QObject - гораздо лучше