【问题标题】:How can a parent class see the properties of its child class?父类如何查看其子类的属性?
【发布时间】:2025-12-09 09:50:01
【问题描述】:

我正在 Qt 上做一些实验。我尝试读取其父类中子类的 Q_PROPERTY 注释的所有属性。我的课程如下所示:

class ParentClass : public QObject
{
    Q_OBJECT
    Q_PROPERTY(ParentProperty...)
    //class stuff...
}

class ChildClass : public ParentClass
{
    Q_OBJECT
    Q_PROPERTY(ChildProperty...)
    //class stuff
}

现在我想读取父类中的所有属性,但是我只能读取父类的属性。如何获取子类的属性?有什么舒服的方法吗?

【问题讨论】:

  • 你认为你为什么需要这个?父类永远不应该知道子类,所以我很自信地说你的类设计有问题。
  • 我的目的是创建一个易于使用的数据库输入/输出系统。因此,用户只需要在他自己的类中定义他想要持久存储在数据库中的属性(属性),该类继承自已经定义了一些属性的父类。父类应该读取其子类的所有属性,并使用所有属性作为属性构建表。我可以将它分开,但是用户必须自己注册自己的属性类。
  • 现在如果用户不希望他的子类的属性被保存到数据库中怎么办?或者如果他甚至不知道基类将访问子类的属性怎么办?您应该在基类中创建一个模板方法,然后从子类中调用它:registerProperty<int>("height", &m_height); 或类似的东西,具体取决于您的程序的工作方式。但一个基本规则是; 从不从基类访问子类。没有例外。

标签: qt properties qobject


【解决方案1】:

您通常不应引用父类中的任何子类。它打破了类继承的想法。

如果您确定需要这样做,则应将对象指针转换为ChildClass* 类型,然后使用其属性。

void ParentClass::needToGoDeeper() {
  ChildClass* obj = qobject_cast<ChildClass*>(this);
  if (obj) {
    int count = obj->metaObject()->propertyCount();
    //...
  }
}

【讨论】:

  • 你打算如何创建一个不包含子类文件的ChildClass*,创建一个包含循环?
  • 如果在“ParentClass.cpp”(不是“ParentClass.h”)的顶部包含“ChildClass.h”,则不会出现包含循环。
  • 哦,对了,我真傻。不过,您仍然不应该建议任何人这样做。