【问题标题】: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++的内存布局问题也考虑到了,才产生了这个限制?

【问题讨论】:

    标签: c++ qt inheritance qobject moc


    【解决方案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 做了一些愚蠢的演员表。
    猜你喜欢
    • 2012-01-24
    • 1970-01-01
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-08
    相关资源
    最近更新 更多