我有一个简单的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实际所属类型的名称?
答案 0 :(得分:2)
我不确定细节,但每个QObject派生类都有自己的元对象结构副本:
MyDerivedObject y;
qDebug() << (void*) y.metaObject();
qDebug() << (void*) y.MyObject::metaObject();
它会为你提供2个不同的meta对象指针。
编辑:我不确定你的第二个问题是什么。但是,如果您想知道QObject是否来自给定的类名,请使用QObject::inherits()来查找。