无法将子类实例作为参数而不是超类传递

Posted

技术标签:

【中文标题】无法将子类实例作为参数而不是超类传递【英文标题】:Unable to pass a subclass instance as argument instead of superclass 【发布时间】:2013-03-06 12:25:02 【问题描述】:

在我的代码中,我的类 McdGraphicsScene 继承自 QGraphicsScene,但是当我尝试将指向 McdGraphicsScene 实例的指针传递给 QGraphicsView::setScene(QGraphicsScene* scene); 时,出现以下错误:

../MeriseModeler/merisemodeler/mcdui.cpp: In member function 'void McdUi::setModel(McdModel*)':
../MeriseModeler/merisemodeler/mcdui.cpp:34:42: error: no matching function for call to 'QGraphicsView::setScene(McdGraphicsScene*)'
../MeriseModeler/merisemodeler/mcdui.cpp:34:42: note: candidate is:
In file included from ../../.qt5/5.0.0/gcc/include/QtWidgets/QGraphicsView:1:0,
                 from ../MeriseModeler/merisemodeler/mcdui.cpp:10:
../../.qt5/5.0.0/gcc/include/QtWidgets/qgraphicsview.h:161:10: note: void QGraphicsView::setScene(QGraphicsScene*)
../../.qt5/5.0.0/gcc/include/QtWidgets/qgraphicsview.h:161:10: note:   no known conversion for argument 1 from 'McdGraphicsScene*' to 'QGraphicsScene*'

这是类的代码

class McdGraphicsScene : public QGraphicsScene

    Q_OBJECT

    // Methods and attributs
;

【问题讨论】:

你是否正确实现了所有的虚方法? 【参考方案1】:

您使用的是McdGraphicsScene 中的任何forward declarations 吗?

确保实际的类定义在调用站点可见。如果只有前向声明可用,则调用代码无法推断出McdGraphicsScene 继承自QGraphicsScene

【讨论】:

以上是关于无法将子类实例作为参数而不是超类传递的主要内容,如果未能解决你的问题,请参考以下文章

您可以将子类作为参数传递给具有超类参数的函数吗? C++

将构造函数值从子类传递到超类c++ [重复]

在java中,我们可以通过传递超类方法中使用的参数的子类来覆盖方法吗?

无法将 kwargs 传递给 Kivy 中的子类——TypeError: object.__init__() 只采用一个参数(要初始化的实例)

将超类作为参数传递给期望子类的方法

将对象实例直接作为 const 接口参数传递时,编译器是不是应该提示/警告?