【问题标题】:Behaviour of QMetaObject within a base class constructor基类构造函数中 QMetaObject 的行为
【发布时间】:2011-02-24 23:31:40
【问题描述】:

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

【问题讨论】:

    标签: qt


    【解决方案1】:

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

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

    这为您提供了 2 个指向元对象的不同指针。

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

    【讨论】:

    • 我的第二个问题更像是,“当基类构造函数被调用时,那么在基类构造函数的范围内,如何找出派生类的className首先调用的”。您的回答确实帮助我理解了问题并制定了解决方法。至于我的问题,现在我看到了,这似乎不太可能。非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 2018-07-16
    • 2014-02-19
    • 2018-05-25
    相关资源
    最近更新 更多