为什么我会收到此错误:' static_cast' :无法转换为' std :: vector< _Ty>' to' std :: vector< _Ty>'

时间:2017-12-03 22:23:02

标签: c++ oop vector

我有一个基类和几个派生自它的类。基类有一个typeID,所有派生类都被赋值,所以我可以区分。我希望创建一个搜索函数,通过矢量列表查看但使用泛型vector :: iterator。我无法static_cast到基类迭代器,但我得到上面的错误。

我已经开发了另一种解决方案,但是我想知道该语言的机制阻止我这样做?

    class CItem {
    public:
        enum ItemType { enumed types here };

        CItem();
        CItem(const string Name, ItemType itemType, const float cost, const float weight);
        virtual ~CItem();
        CItem(const CItem &);
        CItem& operator=(const CItem &);

        int itemID() const { return m_itemID; }
        void itemID(const int id) { m_itemID = id; }

    protected:
        ItemType m_Type;
    };

    class CDerivedClassA: public CItem {
    public:
        CDerivedClassA() {};
        virtual ~CDerivedClassA() {};

    protected:

    private:
    };

class CDerivedClassB: public CItem {
public:
    CDerivedClassB() {};
    virtual ~CDerivedClassB() {};

protected:

private:
};

void CContainer::Search(ItemType it) {
    vector<CItem>::iterator iter;

    switch (it) {
        case IT_GENERAL:
            iter = m_GeneralItemList.begin();
            break;
        case IT_A:
            iter = (static_cast<vector<CItem>>(m_DerivedListA)).begin();
            break;
        case IT_B:
            iter = (static_cast<vector<CItem>>(m_DerivedListB)).begin();
            break;
    }
}

1 个答案:

答案 0 :(得分:1)

vector ::将失去派生类型信息(这称为切片)。剩下的就是属于基础的每个实例的一部分。如果需要在单个容器中处理基类型和派生类型(或仅仅是多个派生类型),则需要使用指针容器而不是容器实例。