Предположим, что у нас есть класс Test
объявлен как:
class Test : public Foo, public QObject
{
Q_OBJECT
[..]
};
Если вы посмотрите на moc_test.cpp
файл, который сгенерировал инструмент moc
, вы увидите что-то вроде:
[..]
const QMetaObject Command::staticMetaObject = {
{ &Foo::staticMetaObject, qt_meta_stringdata_Command,
qt_meta_data_Command, &staticMetaObjectExtraData }
};
[..]
Компилятор будет жаловаться на staticMetaObject
, не являющийся членом Foo
, так как Foo
не является QObject
. По какой-то причине инструмент moc
генерирует этот код, беря первый родительский класс. Таким образом, если вы объявите Test
как:
class Test : public QObject, public Foo {};
сгенерированный код будет выглядеть хорошо, чтобы компилятор.
Я думаю, что это сделано только для удобства, потому что инструмент moc
вряд ли узнает, какой из родительских классов является QObject
без разбора всей иерархии.
Примечание: Если вы не используете макрос Q_OBJECT
, вы можете получить свой класс у других в любом порядке.
Я думаю, что это не только удобство, так как внутри объекта производного класса указатель на базовые классы будет находиться в разных положениях (будет иметь другое смещение). И я думаю, что qt делает какие-то глупые броски. –