C++ 用于继承的Q_对象和moc

C++ 用于继承的Q_对象和moc,c++,qt,C++,Qt,我在一个项目中工作,在我需要继承的类中使用Q_对象宏 已经定义了Q_对象的类如下所示 class cBaseObject : public QObject, public cinformation { Q_OBJECT //... //... } 我正在通过cBaseObject的公共继承创建一个新类。我是否需要再次编写Q_对象宏? 我尝试过使用和不使用该宏,如果我没有包含QT_宏,我发现不会生成moc_XXX.cxx文件 class cEnhancedbaseObje

我在一个项目中工作,在我需要继承的类中使用Q_对象宏

已经定义了Q_对象的类如下所示

class cBaseObject : public QObject, public cinformation
{
    Q_OBJECT
    //...
    //...
}
我正在通过cBaseObject的公共继承创建一个新类。我是否需要再次编写Q_对象宏? 我尝试过使用和不使用该宏,如果我没有包含QT_宏,我发现不会生成moc_XXX.cxx文件

class cEnhancedbaseObject : public cBaseObject
{
    Q_OBJECT   // if i didn't include this 
          //no moc__XXX.cxx file is  generated
} 
但是当我继承类时,为什么Q_对象宏的功能也没有被继承。
如果Q_对象宏被定义两次,如果它是继承的,有什么问题吗?Q_对象的行为如何用于多级继承。我已经读到,对于多重继承,QOBJECT类应该放在第一位。多级继承是否有类似的功能。

存在
Q_对象
宏标志着该类将包含在Qt的元对象系统中。如果你想让你的类在这个元对象系统中有自己的身份,你必须把
Q_对象
宏放进去(当然要确保它是直接或间接从
QObject
派生的)


cBaseObject
cEnhancedbaseObject
的情况下,如果
cEnhancedbaseObject
不包括
Q_对象
宏,它仍将正常工作。然而,就Qt的元对象系统而言,类型为
cEnhancedbaseObject
的对象将是元类型
cBaseObject
。您可以看到,使用诸如
myObject->metaObject()->className()

之类的函数值得注意的是,插槽和信号可以在没有Q_对象的情况下声明,但是连接它们只会在运行时失败(当使用老式/动态连接时),这是一个严重的陷阱。通常,每个QObject子类在默认情况下都应该有Q_OBJECT宏,除非你真的知道自己在做什么。我能想到的没有宏的唯一好理由是QObject派生基类的模板化子类。