Qt 基类构造函数中QMetaObject的行为
我有一个简单的QObject派生对象:Qt 基类构造函数中QMetaObject的行为,qt,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()<<s
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;
}
我不明白。由于继承层次结构是
MyDerivedObject
->MyObject
->QObject,因此它们都具有与父对象相同的QObject实例(对吗?)。我知道大多数运行时类型信息都是通过moc提供的,但这不应该改变一个事实,即一旦我对指向其中一个对象的指针执行静态转换(/*MySomeObject*/)
,就QObject功能而言,它们是相同的东西(甚至在内存中)。那么为什么我会得到不同的className()
返回值呢?无论哪种方式,我如何获得QObject实际所属类型的名称?我不确定详细信息,但每个QObject派生类都有自己的元对象结构副本:
MyDerivedObject y;
qDebug() << (void*) y.metaObject();
qDebug() << (void*) y.MyObject::metaObject();
Myderivedy;
qDebug()我的第二个问题更像是,“当调用基类构造函数时,那么在基类构造函数的范围内,我如何找到首先调用的派生类的className
”。你的回答确实帮助我理解了这个问题并制定了解决方案。至于我的问题,现在我明白了,这似乎真的不可能。非常感谢:)
MyDerivedObject y;
## OUTPUT ###
[BASE] MyObject
[DERIVED] MyDerivedObject
MyDerivedObject y;
qDebug() << (void*) y.metaObject();
qDebug() << (void*) y.MyObject::metaObject();