QMetaObject在基类构造函数中的行为

时间:2011-02-24 14:05:17

标签: qt

我有一个简单的QObject派生对象:

class MyObject : public QObject {
Q_OBJECT
public:
    MyObject(QObject* parent = 0);
};

MyObject::MyObject(QObject* parent) : QObject(parent) {
    std::cout<<"[BASE] "<<this->metaObject()->className()<<std::endl;
}

我进一步推导出这个目标:

class MyDerivedObject : public MyObject {
Q_OBJECT
public:
    MyDerivedObject(QObject* parent);
};

MyDerivedObject::MyDerivedObject(QObject* parent) : MyObject(parent) {
    std::cout<<"[DERIVED] "<<this->metaObject()->className()<<std::endl;
}

每当我实例化这个类时,我得到以下输出:

MyDerivedObject y;

## OUTPUT ###
[BASE] MyObject
[DERIVED] MyDerivedObject

我不明白。由于继承层次结构是MyDerivedObject - &gt; MyObject - &gt; QObject,它们都具有 QObject 的相同实例作为父(右?)。我知道大多数运行时类型信息是通过 moc 提供的,但这不应该改变这样一个事实:一旦我对指向其中一个对象的指针执行static_cast<QObject*>(/*MySomeObject*/) ,只要涉及QObject功能,它们就是相同的东西(即使在内存中)。那为什么我得到className()的不同返回值?无论哪种方式,我如何获得QObject实际所属类型的名称?

1 个答案:

答案 0 :(得分:2)

我不确定细节,但每个QObject派生类都有自己的元对象结构副本:

MyDerivedObject y;

qDebug() << (void*) y.metaObject();
qDebug() << (void*) y.MyObject::metaObject();

它会为你提供2个不同的meta对象指针。

编辑:我不确定你的第二个问题是什么。但是,如果您想知道QObject是否来自给定的类名,请使用QObject::inherits()来查找。