Russian Qt Forum
Ноябрь 26, 2024, 09:31
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Виртуальное наследование от класса Qt
Страниц:
1
[
2
]
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Виртуальное наследование от класса Qt (Прочитано 17062 раз)
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Виртуальное наследование от класса Qt
«
Ответ #15 :
Сентябрь 29, 2011, 17:59 »
Цитата: lit-uriy от Сентябрь 29, 2011, 17:08
"Виртуальное наследование с помощью QObject не поддерживается."
Тыц
Юра, то "тыц" пальцем в небо
Не стоит повторять неграмотную фразу: не бывает "наследования с помощью", есть "наследование от". Поддерживать или нет решает С++, а не Qt, и поскольку QObject класс, то он может быть виртуально унаследован. А вот как он будет работать - то уже другой вопрос
Представим себе что запрос
Alf
удовлетворен. Это капитальный геморрой для разработчика. Надо как-то "слить" слоты/сигналы из всех базовых классов, надо как-то решить конфликты: напр 2 базовых класса имеют слот с одним именем - какой активен? С др стороны множественное наследование - случай достаточно редкий, в большинстве случаев может быть без ущерба заменен членством. Поэтому гораздо проще и лучше сказать "нельзя!", это ясно и понятно для широкого круга пользователей
Записан
lit-uriy
Джедай : наставник для всех
Offline
Сообщений: 3880
Re: Виртуальное наследование от класса Qt
«
Ответ #16 :
Сентябрь 30, 2011, 09:59 »
>>Поддерживать или нет решает С++, а не Qt
В контексте Qt - не верно. Это определяется мета-объектным компилятором - moc. И реализацией классов Qt (в Qt ни один класс-наследник QObject не имеет пометки "virtual" при наследовании, например, QWidget).
А так как наследование от QObject имеет смысл из-за метаобъектной системы (сигнал, слоты, свойства ...). То и получается, что С++ компилятор можно даже не рассматривать.
Наиболее распространённая хотелка (обоснованная) программистов - написать интерфейс с сигналами (или слотами), а затем наследоватся от QObject'ов и этого интерфейса, в Qt не возможна.
Записан
Юра.
andrew.k
Гость
Re: Виртуальное наследование от класса Qt
«
Ответ #17 :
Сентябрь 30, 2011, 10:30 »
Цитата: lit-uriy от Сентябрь 30, 2011, 09:59
>>Поддерживать или нет решает С++, а не Qt
В контексте Qt - не верно. Это определяется мета-объектным компилятором - moc. И реализацией классов Qt (в Qt ни один класс-наследник QObject не имеет пометки "virtual" при наследовании, например, QWidget).
А так как наследование от QObject имеет смысл из-за метаобъектной системы (сигнал, слоты, свойства ...). То и получается, что С++ компилятор можно даже не рассматривать.
Наиболее распространённая хотелка (обоснованная) программистов - написать интерфейс с сигналами (или слотами), а затем наследоватся от QObject'ов и этого интерфейса, в Qt не возможна.
Невозможна или не разрешена?
А если сделать все внимательно, чтобы имена слотов и сигналов не пересекались. Будет ли работать?
Записан
shirushizo
Гость
Re: Виртуальное наследование от класса Qt
«
Ответ #18 :
Сентябрь 30, 2011, 10:41 »
Самое нормальное решение уже озвучили:
Цитата: kambala от Сентябрь 28, 2011, 15:03
попробуй выделить какой-то общий интерфейс или класс (естественно не наследник QObject) и унаследовать оба своих класса от него
Выделяем класс C, в который уходит часть функционала, которую добавили в класс A
Код:
class C {...};
class D : public QObject, public C {...};
class B : public QWidget, public C {...};
Оба класс B и D получили необходимый функционал через класс C, и сигнал/слот и свойства от QObject. И вся проблема
Того гляди и moc выпендриваться не будет.
Записан
andrew.k
Гость
Re: Виртуальное наследование от класса Qt
«
Ответ #19 :
Сентябрь 30, 2011, 10:45 »
да это был теоретический вопрос, а не практический. так то все понятно.
просто чтобы лучше понимать устройство.
Записан
Igors
Джедай : наставник для всех
Offline
Сообщений: 11445
Re: Виртуальное наследование от класса Qt
«
Ответ #20 :
Сентябрь 30, 2011, 12:41 »
Цитата: shirushizo от Сентябрь 30, 2011, 10:41
Выделяем класс C, в который уходит часть функционала, которую добавили в класс A
Код:
class C {...};
class D : public QObject, public C {...};
class B : public QWidget, public C {...};
Оба класс B и D получили необходимый функционал через класс C, и сигнал/слот и свойства от QObject. И вся проблема
Так класс С не может быть потомком QObject, и это создает известные неудобства: приходится делать ему член-указатель и возиться с ним. Хотя ничего особо страшного/плохого нет.
Записан
shirushizo
Гость
Re: Виртуальное наследование от класса Qt
«
Ответ #21 :
Сентябрь 30, 2011, 13:45 »
Цитата: andrew.k от Сентябрь 30, 2011, 10:45
да это был теоретический вопрос, а не практический. так то все понятно.
просто чтобы лучше понимать устройство.
В теории сам язык Си++ позволяет использовать в этом случае виртуальное наследование и любой компилятор с этим справится. Проблема в метаобъектной системе самой библиотеки Qt и в инструменте moc, который просто не поймет что вы от него хотите: какой из слотов/сигналов использовать, какой из Q_PROPERTY подразумевается - и никакой виртуальной таблицей здесь не обойдешься, просто не будет однозначности и даже, если всю эту б-гадельню получится запустить поведение будет непредсказуемо и неконтролируемо.
Записан
lit-uriy
Джедай : наставник для всех
Offline
Сообщений: 3880
Re: Виртуальное наследование от класса Qt
«
Ответ #22 :
Октябрь 01, 2011, 23:08 »
>>А если сделать все внимательно, чтобы имена слотов и сигналов не пересекались. Будет ли работать?
у меня не работало, точно не помню кто ругался, сам МОС или С++ на продукт МОСа
(П.С. В интерфейсе было объявлено несколько сигналов, в наследнике они посылались)
Записан
Юра.
Страниц:
1
[
2
]
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...