繁体   English   中英

在子类上调用虚拟方法将返回超类数据

[英]Calling virtual method on subclass returns superclass data

我有两个类,想获取子类的元信息:

class DataObject : public QObject {
    Q_OBJECT
    ...
    public:
         virtual void meta() {
             const QMetaObject *mo = QObject::metaObject();

             for (int i = 0; i < mo->propertyCount(); i++) {
                 qDebug() << mo->property(i).name() << mo->property(i).read(this);
             }
         }
    ...
}

class User : public DataObject {
    Q_OBJECT
    Q_PROPERTY(int id MEMBER m_id)
    ...
}

当我在User对象上调用meta时,它仅输出默认对象属性objectName ,而不输出User类中声明的属性。

我能以某种方式获得子类的元信息,而不必在每个手工实现方法的情况下得到它吗?

您需要通过动态调度而不是静态调用metaObject()Class::method()是静态调度)。 您也不需要meta()是虚拟的,甚至不需要方法-它应该是一个独立的函数,它适用于传递给它的任何对象; C ++不是Java。

下面是一个示例。 输出:

objectName QVariant(QString, "")
id QVariant(int, 1)
// https://github.com/KubaO/stackoverflown/tree/master/questions/meta-derived-38268004
#include <QtCore>

void meta(QObject * obj) {
   auto mo = obj->metaObject();
   for (int i = 0; i < mo->propertyCount(); i++)
      qDebug() << mo->property(i).name() << mo->property(i).read(obj);
}

struct DataObject : QObject {
   Q_OBJECT
};

struct User : DataObject {
   Q_PROPERTY(int id MEMBER m_id)
   Q_OBJECT
   int m_id { 1 };
};

int main() {
   User user;
   Q_ASSERT(user.metaObject()->propertyCount() == 2);
   meta(&user);
}

#include "main.moc"

您正在显式调用QObject::metaObject()方法,即QObject基类的方法。 从您的meta()实现中删除QObject::部分,以便在运行时调用metaObject()虚拟实现

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM