Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么在多重继承的情况下QObject必须是第一个_C++_Qt_Inheritance_Qobject_Moc - Fatal编程技术网

C++ 为什么在多重继承的情况下QObject必须是第一个

C++ 为什么在多重继承的情况下QObject必须是第一个,c++,qt,inheritance,qobject,moc,C++,Qt,Inheritance,Qobject,Moc,根据QObject,当使用多重继承时,QObject必须是基类中的第一个 这是因为在代码中有一些限制吗?MOC < /C>工具还是C++内存布局问题也被考虑进去,因此这个限制就成立了吗?< /P> < P>假设我们有一个类测试< /CUL> >声明为: class Test : public Foo, public QObject { Q_OBJECT [..] }; 如果您查看moc工具生成的moc_test.cpp文件,您将看到如下内容: [..] const QMetaO

根据
QObject,当使用多重继承时,QObject必须是基类中的第一个


这是因为在代码中有一些限制吗?MOC < /C>工具还是C++内存布局问题也被考虑进去,因此这个限制就成立了吗?< /P> < P>假设我们有一个类<代码>测试< /CUL> >声明为:

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\u对象
宏,您可以从其他对象以任何顺序派生类。

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