2015-02-24 5 views
3

В соответствии с http://qt-project.org/doc/qt-4.8/moc.html#multiple-inheritance-requires-qobject-to-be-firstQObject должен быть первым в базовых классах при использовании множественного наследования.Почему QObject должен быть первым в случае множественного наследования

Это связано с некоторыми ограничениями в утилите памяти moc или C++, поэтому это ограничение возникло?

ответ

4

Предположим, что у нас есть класс 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, вы можете получить свой класс у других в любом порядке.

+0

Я думаю, что это не только удобство, так как внутри объекта производного класса указатель на базовые классы будет находиться в разных положениях (будет иметь другое смещение). И я думаю, что qt делает какие-то глупые броски. –

Смежные вопросы