c++ - 在子类上调用虚方法返回父类(super class)数据

标签 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)
    ...
}

当我在 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"

关于c++ - 在子类上调用虚方法返回父类(super class)数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38268004/

相关文章:

c# - 在 Windows 中捕获 http/https 请求

c++ - 打开MP;嵌套循环之间的 Action

c++ - QT中如何将变量从一个线程共享到多个线程

c++ - 向小部件添加标签

c++ - 在不复制的情况下从 Eigen::SparseMatrix 中提取 block /ROI

c++ - 指向模板函数的函数指针

c++ - 成功运行 10 小时后,Windows 应用程序在 Release模式下出现异常,如何检测到哪里出了问题?

c++ - Qt 和 SQLite : filter using the elements of an array

c++ - VTK 6.1 和 Qt 5.3 : 3D Objects in QVTKWidget with bad transparencies

windows - 使用 CMake 2.8.11.2 编译 osgQt (Windows7 MSVS11 Qt 5.1 OSG 3.2.0)