c ++传递子类作为参数

时间:2017-01-15 14:29:33

标签: c++ qt inheritance

我有一个名为Obje的超类

#ifndef OBJE_H
#define OBJE_H

#include <QString>

class Obje
{
    public:
    Obje();
    QString name="";
    int id;
    int itemid=0;
    void setItemid(int i);
    virtual void update(){};
};

#endif // OBJE_H

我得到了一个名为Npc

的子类
#ifndef NPC_H
#define NPC_H

#include "obje.h"
#include "QString"
#include "QPixmap"
class Npc : public Obje
{
public:

    Npc(QString dir="left");
    QString direction="left";

    QPixmap* spriteSheet = nullptr;
    QPixmap face;
    QPixmap sprites[3];
    void update(int nid);
    QPixmap* getCurrentSprite();
    int currentFrame;
    QString frameDirection;

};

#endif // NPC_H

我还有一个类来管理listWidgets

class ListUpdate
{
public:
    ListUpdate();
    static void update(QListWidget *q, vector<Obje>& i);

    private:
    static struct item{
        QString id;
        QString name;
        QPixmap px;
    };

    static QListWidgetItem* newItem(ListUpdate::item &i, int c);
};

#endif // LISTUPDATE_H

当我尝试传递名为&#34; npcs&#34;的对象时这是类型向量&#34; Npc&#34;到ListUpdate :: update,它给出了这个错误 传递矢量:

ListUpdate::update(ui->listWidget,npcs);

错误:

C:\Qt Projects\RpgEditor\npcscreen.cpp:64: error: C2665: 'ListUpdate::update': none of the 3 overloads could convert all the argument types

注意:我还有另外两个重载函数,我没有在这里写它们以防止不必要的混淆(这就是为什么它说,&#34;没有3个重载&#34;)< / p>

为什么它不接受我的子类?

1 个答案:

答案 0 :(得分:0)

base 类和派生的类之间的关系不会扩展到容器(少数特殊情况除外)。 std::vector<Npc>无法转换为std::vector<Obje>。也许您可以像这样模拟update方法:

template<class T>
static void update(QListWidget *q, vector<T>& i);

此解决方案适用于与Obje的预期界面匹配的任何类型的向量,包括但不限于公开派生自Obje的类型。