为什么在多重继承的情况下QObject需要是第一个

Why QObject needs to be the first in case of multiple inheritance

根据 http://qt-project.org/doc/qt-4.8/moc.html#multiple-inheritance-requires-qobject-to-be-first 使用多重继承时,QObject 必须是基 类 中的第一个。

是因为moc工具的一些限制还是考虑了C++的内存布局问题,所以才出现这个限制?

假设我们有一个 class Test 声明为:

class Test : public Foo, public QObject
{
    Q_OBJECT
    [..]
};

如果您查看 moc 工具生成的 moc_test.cpp 文件,您将看到如下内容:

[..]
const QMetaObject Command::staticMetaObject = {
    { &Foo::staticMetaObject, qt_meta_stringdata_Command,
      qt_meta_data_Command, &staticMetaObjectExtraData }
};
[..]

编译器会抱怨 staticMetaObject 不是 Foo 的成员,因为 Foo 不是 QObject。出于某种原因,moc 工具生成此代码采用 first 父 class。因此,如果您将 Test 声明为:

class Test : public QObject, public Foo {};

生成的代码对编译器来说看起来很好。

我认为这样做只是为了方便,因为 moc 工具在不解析整个层次结构的情况下很难知道哪个父 class 是 QObject

注意:如果您不使用Q_OBJECT宏,您可以按任意顺序从其他人那里导出您的class。