来自两个抽象类的多重继承 (Qt)

Posted

技术标签:

【中文标题】来自两个抽象类的多重继承 (Qt)【英文标题】:Multiple inheritance from two abstract classes (Qt) 【发布时间】:2014-05-03 12:50:24 【问题描述】:

我有我的抽象类 (A),它描述了一次实地考察和 Qt 基类 QGraphicsItem,它描述了用于控制项目的 Qt 函数。我想从这些类继承到它们的项目。

问题是项目列表存储在QList <QGraphicsItem *>中,导致无法直接访问A ::字段,也不想使用dynamic_cast。还有什么其他选择?

重要的是该项目可能不是最终的孩子,即它可以从其他项目继承(以及通过多重继承)。

QList <QGraphicsItem *> 中只保留从AQGraphicsItem 继承的元素。你有什么建议?感谢您的帮助。

UPD1: 这段代码:

    QList<QGraphicsItem *> items=scene->items();
    for(int i=0;i<items.size();++i)
        std::cerr<<"\n"<<items.at(i)->entity::getX();
    

(entity is A) 抛出错误:

/home/user/works/cpp/QT/Objcts/src/mainwindow.cpp:87: error: 'entity' is not a base of 'QGraphicsItem' std::cerr<<"\n"<<items.at(i)->entity::getX(); ^

【问题讨论】:

那么,您继承自两个基类,并且您需要消除成员访问的歧义?这就是为 :: 设计的范围运算符。 我了解有必要指定范围:instance.A::methodFromA()instance.QGraphicsItem::methodFromQt ()。但是当你尝试从列表中检索一个项目并以这种方式调用方法时,我得到一个错误,因为将返回到QGraphicsItem*的类型,这对于A的方法是已知的。 我不明白这个问题...这是什么意思making it impossible to access the fields A :: -> 您也不能通过良好的设计直接访问子成员,那么这与 A 有什么关系?我不明白。或者您也指“字段”而不只是数据成员的方法?这个问题就目前而言是模糊的。我认为您想添加代码来实际演示您的问题。如果你只是问如何避免dynamic_casting,好吧,你不能,好吧,这不公平,你需要使用qobject_cast,但这并不能解决问题。 我更新了主信息,保存代码格式。 也许发布(询问)您想要实现的目标(即您想要解决的问题)更有用,因为这样我们可以尝试帮助您走上正确的道路(我们可以帮助您组织数据结构和类)。 【参考方案1】:

/home/user/works/cpp/QT/Objcts/src/mainwindow.cpp:87: 错误:'entity' 不是 'QGraphicsItem' std::cerr

您正在尝试访问一个基类,而您的实体类(奇怪地没有 CamelCase 命名)没有继承它。

没错,这就是动态转换的用例,例如 C++ 中的dynamic_cast。你应该利用它。

话虽如此,对于QObjects,在Qt 世界中使用qobject_cast 比使用原始dynamic_cast 更好。 QGraphicsItem 故意不是 QObject,尽管您的其他基础(实体)可能是,但这不相关。

这段代码应该可以帮助你:

QList<QGraphicsItem *> items = scene->items();
foreach (GraphicsItem* item, items) 
    entity *e = dynamic_cast<entity*>(item);
    if (e)
        qDebug() << e->getX();

免责声明:我没有测试过这段代码,但我认为这个概念是有效的。

既不需要标准错误,也不需要显式索引循环。您可以根据需要使用 Qt 调试功能进行打印,并使用 foreach 遍历元素。

另外,在 Qt 世界中,“getX”并不是一个真正的通用约定。人们倾向于放弃“get”前缀以减少输入。

【讨论】:

我不能使用qobject_cast 作为QGraphicsItem 不继承自QObjectdynamic_cast 是可能的,但不可取。 是的,我同意。我实际上正在调查那个。我推荐 dynamic_cast。 很遗憾没有正常的解决方案。规定在运行的应用程序中不要使用dynamic_cast。感谢您的帮助。附言让问题有点悬而未决,如果要求在一周内做不到,我会关闭。 我不确定为什么 dynamic_cast 不是一个正常的解决方案。它是为这个用例设计的。 Qt 优惠qgraphicsitem_cast,不知道是否适用。

以上是关于来自两个抽象类的多重继承 (Qt)的主要内容,如果未能解决你的问题,请参考以下文章

Django:从带有元的抽象类的多重继承

抽象类的多重继承导致定义不明确

12:抽象类,接口,多重继承

如果 QObject 是从 DIRECTLY 派生的,那么使用 *virtual* 多重继承是不是安全?

抽象基类、私有继承和多重公有继承

ts 类的变量、方法、实例化、继承、实现接口、抽象类