根据http://qt-project.org/doc/qt-4.8/moc.html#multiple-inheritance-requires-qobject-to-be-first,QObject
在使用多重继承时必须是基类中的第一个。
这是因为moc
工具中的某些限制还是C ++内存布局问题也被考虑在内,因此这种限制是否存在?
答案 0 :(得分: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
宏,则可以按任何顺序从其他人派生您的课程。