我有一个基类和几个派生自它的类。基类有一个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;
}
}
答案 0 :(得分:1)
vector ::将失去派生类型信息(这称为切片)。剩下的就是属于基础的每个实例的一部分。如果需要在单个容器中处理基类型和派生类型(或仅仅是多个派生类型),则需要使用指针容器而不是容器实例。