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

Fer*_*eak 5 c++ inheritance qt moc qobject

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

这是因为moc工具的某些限制还是C ++内存布局问题也被考虑在内,因此这种限制就已经存在了吗?

vah*_*cho 5

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

class Test : public Foo, public QObject
{
    Q_OBJECT
    [..]
};
Run Code Online (Sandbox Code Playgroud)

如果查看moc_test.cppmoc工具生成的文件,将会看到类似以下内容的内容:

[..]
const QMetaObject Command::staticMetaObject = {
    { &Foo::staticMetaObject, qt_meta_stringdata_Command,
      qt_meta_data_Command, &staticMetaObjectExtraData }
};
[..]
Run Code Online (Sandbox Code Playgroud)

编译器会抱怨自己staticMetaObject不能成为成员Foo,而Foo不是QObject。由于某种原因,该moc工具使用第一个父类生成此代码。因此,如果您声明Test为:

class Test : public QObject, public Foo {};
Run Code Online (Sandbox Code Playgroud)

生成的代码对编译器来说看起来不错。

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

注意:如果不使用Q_OBJECT宏,则可以按任何顺序从其他类派生您的类。