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

时间:2015-02-24 12:01:00

标签: c++ qt inheritance qobject moc

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

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

1 个答案:

答案 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宏,则可以按任何顺序从其他人派生您的课程。