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

Posted

技术标签:

【中文标题】为啥在多重继承的情况下QObject需要是第一个【英文标题】:Why QObject needs to be the first in case of multiple inheritance为什么在多重继承的情况下QObject需要是第一个 【发布时间】:2015-02-24 12:00:59 【问题描述】:

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

这是因为moc工具的一些限制还是C++的内存布局问题也考虑到了,才产生了这个限制?

【问题讨论】:

【参考方案1】:

假设我们有一个类 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 父类生成此代码。因此,如果您将Test 声明为:

class Test : public QObject, public Foo ;

生成的代码在编译器中看起来不错。

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

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

【讨论】:

我认为这不仅仅是方便,因为在派生类对象中,指向基类的指针将位于不同的位置(会有不同的偏移量)。而且我认为 qt 做了一些愚蠢的演员表。

以上是关于为啥在多重继承的情况下QObject需要是第一个的主要内容,如果未能解决你的问题,请参考以下文章

QObject的多重继承

QObject 多重继承

C++ 中 QObject 多重继承和策略/特征设计的问题

使用 qobject 基础的多重继承

如果 QObject 是从 DIRECTLY 派生的,那么使用 *virtual* 多重继承是不是安全?

Qt中图元对象的多重集成