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
Qt 基类构造函数中QMetaObject的行为_Qt - Fatal编程技术网

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

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

我有一个简单的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;
}

我不明白。由于继承层次结构是
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();