Я понимаю, что в целом множественное наследование от QObject
производных классов (даже виртуальное множественное наследование) не поддерживается в Qt.
Я понимаю, что причина в том (я думаю), что даже в случае виртуального наследования классы Qt сами виртуально не наследуются от QObject
. Например, если вы попытаетесь виртуально вывести класс как из QWidget
, так и из QThread
, это поместит виртуальное наследование в нерелевантное место в цепочке наследования, и вы все равно получите два экземпляра QObject
.
Поэтому я считаю безопасным и поддерживаемым в Qt использование виртуального наследования, когда ЕДИНСТВЕННЫЙ класс Qt, производный от которого является самим QObject
.
У меня есть:
class Top : public QObject {};
class Left : public virtual Top {};
class Right : public virtual Top {};
class Bottom : public Left, public Right {}; // Is this safe, and supported by Qt?
Обратите внимание, что экземпляры Bottom
действительно имеют только один экземпляр Top
(и, следовательно, только один экземпляр QObject
), так что кажется, что обоснование отказа от множественного наследования в Qt (даже виртуального множественного наследования) не применимо. здесь.
Тем не менее приведенная выше конструкция приводит к предупреждению компилятора Qt Class Bottom inherits from two QObject subclasses Left and Right. This is not supported!
.
Я прав? Безопасно ли игнорировать предупреждение компилятора Qt в этом конкретном сценарии? Является ли приведенная выше конструкция, включающая виртуальное множественное наследование непосредственно от QObject, безопасной и поддерживается в Qt?
QObject
, то все в порядке. Если он где-то попытается получить смещение члена вместо использования указателя на член, это может быть не так. - person Useless   schedule 08.05.2013Top
,Left
,Right
и/илиBottom
. - person Dan Nissenbaum   schedule 08.05.2013Top
. ИTop
может использовать виртуальные функции для делегирования реализации своим подклассам, но Qt не будет знать, как с ними обращаться. - person Ben Voigt   schedule 08.05.2013