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

str*_*nmn 1 c++ qt qt5

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

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)
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

我可以以某种方式获取子类的元信息,而无需手动实现每一个方法吗?

Rei*_*ica 5

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

一个例子如下.输出:

objectName QVariant(QString, "")
id QVariant(int, 1)
Run Code Online (Sandbox Code Playgroud)
// 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"
Run Code Online (Sandbox Code Playgroud)