2015-02-24 40 views

回答

4

假设我们有一个类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工具会生成此代码,其中为第一个父类。因此,如果你声明Test为:

class Test : public QObject, public Foo {}; 

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

我认为这只是为了方便,因为moc工具几乎不知道哪个父类是QObject而没有解析整个层次结构。

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

+0

我认为这不仅是便利,因为在派生类对象内,指向基类的指针将位于不同的位置(将具有不同的偏移量)。我认为qt做了一些愚蠢的演员。 – 2015-02-24 13:10:03

相关问题