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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Виртуальное наследование от класса Qt  (Прочитано 17075 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Сентябрь 29, 2011, 17:59 »

"Виртуальное наследование с помощью QObject не поддерживается."
Тыц
Юра, то "тыц" пальцем в небо Улыбающийся Не стоит повторять неграмотную фразу: не бывает "наследования с помощью", есть "наследование от". Поддерживать или нет решает С++, а не Qt, и поскольку QObject класс, то он может быть виртуально унаследован. А вот как он будет работать - то уже другой вопрос  Улыбающийся

Представим себе что запрос Alf удовлетворен. Это капитальный геморрой для разработчика. Надо как-то "слить" слоты/сигналы из всех базовых классов, надо как-то решить конфликты: напр 2 базовых класса имеют слот с одним именем - какой активен? С др стороны множественное наследование - случай достаточно редкий, в большинстве случаев может быть без ущерба заменен членством. Поэтому гораздо проще и лучше сказать "нельзя!", это ясно и понятно для широкого круга пользователей  Улыбающийся
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #16 : Сентябрь 30, 2011, 09:59 »

>>Поддерживать или нет решает С++, а не Qt
В контексте Qt - не верно. Это определяется мета-объектным компилятором - moc. И реализацией классов Qt (в Qt ни один класс-наследник QObject не имеет пометки "virtual" при наследовании, например, QWidget).

А так как наследование от QObject имеет смысл из-за метаобъектной системы (сигнал, слоты, свойства ...). То и получается, что С++ компилятор можно даже не рассматривать.

Наиболее распространённая хотелка (обоснованная) программистов - написать интерфейс с сигналами (или слотами), а затем наследоватся от QObject'ов и этого интерфейса, в Qt не возможна.

Записан

Юра.
andrew.k
Гость
« Ответ #17 : Сентябрь 30, 2011, 10:30 »

>>Поддерживать или нет решает С++, а не Qt
В контексте Qt - не верно. Это определяется мета-объектным компилятором - moc. И реализацией классов Qt (в Qt ни один класс-наследник QObject не имеет пометки "virtual" при наследовании, например, QWidget).

А так как наследование от QObject имеет смысл из-за метаобъектной системы (сигнал, слоты, свойства ...). То и получается, что С++ компилятор можно даже не рассматривать.

Наиболее распространённая хотелка (обоснованная) программистов - написать интерфейс с сигналами (или слотами), а затем наследоватся от QObject'ов и этого интерфейса, в Qt не возможна.


Невозможна или не разрешена?
А если сделать все внимательно, чтобы имена слотов и сигналов не пересекались. Будет ли работать?
Записан
shirushizo
Гость
« Ответ #18 : Сентябрь 30, 2011, 10:41 »

Самое нормальное решение уже озвучили:
попробуй выделить какой-то общий интерфейс или класс (естественно не наследник QObject) и унаследовать оба своих класса от него
Выделяем класс C, в который уходит часть функционала, которую добавили в класс A
Код:
class C {...}; 
class D : public QObject, public C {...};
class B : public QWidget, public C {...};
Оба класс B и D получили необходимый функционал через класс C, и сигнал/слот и свойства от QObject. И вся проблема Подмигивающий Того гляди и moc выпендриваться не будет.
Записан
andrew.k
Гость
« Ответ #19 : Сентябрь 30, 2011, 10:45 »

да это был теоретический вопрос, а не практический. так то все понятно.
просто чтобы лучше понимать устройство.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Сентябрь 30, 2011, 12:41 »

Выделяем класс C, в который уходит часть функционала, которую добавили в класс A
Код:
class C {...}; 
class D : public QObject, public C {...};
class B : public QWidget, public C {...};
Оба класс B и D получили необходимый функционал через класс C, и сигнал/слот и свойства от QObject. И вся проблема Подмигивающий
Так класс С не может быть потомком QObject, и это создает известные неудобства: приходится делать ему член-указатель и возиться с ним. Хотя ничего особо страшного/плохого нет.
Записан
shirushizo
Гость
« Ответ #21 : Сентябрь 30, 2011, 13:45 »

да это был теоретический вопрос, а не практический. так то все понятно.
просто чтобы лучше понимать устройство.
В теории сам язык Си++ позволяет использовать в этом случае виртуальное наследование и любой компилятор с этим справится. Проблема в метаобъектной системе самой библиотеки Qt и в инструменте moc, который просто не поймет что вы от него хотите: какой из слотов/сигналов использовать, какой из Q_PROPERTY подразумевается - и никакой виртуальной таблицей здесь не обойдешься, просто не будет однозначности и даже, если всю эту б-гадельню получится запустить поведение будет непредсказуемо и неконтролируемо.
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #22 : Октябрь 01, 2011, 23:08 »

>>А если сделать все внимательно, чтобы имена слотов и сигналов не пересекались. Будет ли работать?
у меня не работало, точно не помню кто ругался, сам МОС или С++ на продукт МОСа
(П.С. В интерфейсе было объявлено несколько сигналов, в наследнике они посылались)
Записан

Юра.
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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