无法从指针派生类转换为指针基类(多态)

时间:2016-04-01 13:43:53

标签: c++ pointers inheritance polymorphism

我有上述问题,但原因显然在其他地方,因为之前曾经工作过,除了最小化项目的包含和转发声明之外,我没有做任何重大更改。

我有几个类,都来自某些QObjectsUIElementInterface。在以下示例中,QCheckBox

#ifndef CHECKBOX_H
#define CHECKBOX_H

#include <QCheckBox>
#include "uielementinterface.h"

#include <QString>

class QPoint;
class QSize;
class QWidget;

class CheckBox : public QCheckBox, public UIElementInterface
{
    Q_OBJECT
//...
public:
    CheckBox(const QString& label, const QString& define, const QString& header, const QPoint& pos, const QSize& size, QWidget *parent = 0);
};
#endif

UIElementInterface

#ifndef UIELEMENTINTERFACE_H
#define UIELEMENTINTERFACE_H

class UIElementInterface
{
public:
    virtual ~UIElementInterface(){}
    UIElementInterface(const QString& define, const QString& header);
    //...        
};
#endif

XmlReader我转发声明CheckBox(和UIElementInterface)。在这里,我通过指针传递CheckBox*作为其基础UIElementInterface

void XmlReader::readCheckBox(ContainerInterface* container, const QString& header)
{
    Q_ASSERT(xml.isStartElement() && xml.name() == "checkbox");
    QXmlStreamAttributes attr = xml.attributes();
    CheckBox* checkBox = container->createCheckBox(getLabel(attr), getDefine(attr), getHeader(attr, header), getTopLeft(attr), getSize(attr));
    m_centralWidget->setUIElement(getDefine(attr), checkBox); //<--Compiler Error, used to work fine.
    xml.readElementText();
}

我在CheckBoxUIElementInterface构造函数中进行了一些打印,以验证两者的正确初始化。

以下是setUIElement的实施:

void CentralWidget::setUIElement(const QString& define, UIElementInterface* UIElement)
{
    m_uiElementMap[define] = UIElement;
}

XmlReader调用此内容给我:

error: no matching function for call to 'CentralWidget::setUIElement(QString, CheckBox*&)'

static_castCheckBox的{​​{1}}会出现UIElementInterface错误,而隐式演员会给我invalid static_cast错误。

就像我说的那样,相同的继承模式曾经用于工作,据我所知它是有效的。所以: 我缺少什么?

提前致谢。

修改

这是编译器输出(用于调用cannot convert ... in initialization):

setUIElement

../src/xmlreader.cpp:278: error: no matching function for call to 'CentralWidget::setUIElement(QString, CheckBox*&)' ../include/centralwidget.h:40: note: candidates are: void CentralWidget::setUIElement(const QString&, UIElementInterface*)

的类定义
CentralWidget

1 个答案:

答案 0 :(得分:0)

m_centralWidget->setUIElement(getDefine(attr), checkBox);

m_centralWidget->setUIElement(getDefine(attr), (UIElementInterface*)checkBox);