C++ 对子类调用虚方法返回超类数据

C++ 对子类调用虚方法返回超类数据,c++,qt,qt5,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++) {

我有两个类,希望获得子类的元信息:

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)
    ...
}
类数据对象:公共QObject{
Q_对象
...
公众:
虚拟空元(){
常量QMetaObject*mo=QObject::metaObject();
对于(int i=0;ipropertyCount();i++){
qDebug()属性(i).name()属性(i).read(this);
}
}
...
}
类用户:公共数据对象{
Q_对象
Q_属性(int id成员m_id)
...
}
当我在
用户
对象上调用meta时,它只输出默认的对象属性
对象名
,而不是用户类中声明的属性


我是否可以在不手动在每个子类中实现该方法的情况下以某种方式获取子类的元信息?

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

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

objectName QVariant(QString, "")
id QVariant(int, 1)
//https://github.com/KubaO/stackoverflown/tree/master/questions/meta-derived-38268004
#包括
无效元(QObject*obj){
自动mo=obj->metaObject();
对于(int i=0;ipropertyCount();i++)
qDebug()属性(i).name()属性(i).read(obj);
}
结构数据对象:QObject{
Q_对象
};
结构用户:数据对象{
Q_属性(int id成员m_id)
Q_对象
int m_id{1};
};
int main(){
用户;
Q_断言(user.metaObject()->propertyCount()==2);
元用户;
}
#包括“main.moc”

您需要通过动态分派而不是静态地调用
元对象()
Class::method()
是静态分派)。您也不需要
meta()
是虚拟的,甚至不需要方法-它应该是一个独立的函数,它适用于您传递给它的任何对象;C++不是java .< /p> 下面是一个例子。输出:

objectName QVariant(QString, "")
id QVariant(int, 1)
//https://github.com/KubaO/stackoverflown/tree/master/questions/meta-derived-38268004
#包括
无效元(QObject*obj){
自动mo=obj->metaObject();
对于(int i=0;ipropertyCount();i++)
qDebug()属性(i).name()属性(i).read(obj);
}
结构数据对象:QObject{
Q_对象
};
结构用户:数据对象{
Q_属性(int id成员m_id)
Q_对象
int m_id{1};
};
int main(){
用户;
Q_断言(user.metaObject()->propertyCount()==2);
元用户;
}
#包括“main.moc”