在子类上调用虚拟方法将返回超类数据
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()
的虚拟实现
相关文章:
- 如何返回一个类的两个对象相加的结果
- 模板转换为超类
- 从父类方法返回子类对象
- 我的超类中的模板问题与结构定义
- 创建子类的多个实例,其中只有一个超类实例
- 给定一个指向对象的超类指针,如何获取对象的大小?
- 为什么在返回 ostream 类时使用引用?
- 从对象的向量返回某个类的对象
- C++ 基类调用但返回派生类
- 重写另一个方法 [C++] 使用的超类回调函数
- 用初始化列表和超类构造函数声明子类构造函数的正确方式
- 返回C++类中的函数指针
- 我们可以在没有新实例化的情况下声明一个抽象方法来返回抽象超类中的子类对象吗
- 使用Rcpp返回GMP类
- C++为API中定义的结构创建超类
- 使用派生类C++方法的超类
- C++:使用超类和子类,简单计算面积的值返回3.47668e-310,无论我输入什么来计算
- 从超类函数返回子类定义
- Qt:不正确的返回值从invokemethod从继承超类
- 在子类上调用虚拟方法将返回超类数据