设置
class Base
{
public:
Base();
virtual ~Base();
int getType();
protected:
int type;
};
class DerivedA : public Base
{
public:
DerivedA() { this->type = 1; };
~DerivedA();
int getA() { return 1;};
};
class DerivedB : public Base
{
public:
DerivedB() { this->type = 2; };
~DerivedB();
int getB() { return 2;};
};
目标
拥有一个包含两个派生类的对象的向量,然后能够访问特定于子类的方法。
当前的“解决方案”
int main()
{
typedef boost::ptr_vector<Base> BasePtr;
BasePtr vec;
// Fill vec with some stuff
vec.push_back(new DerivedA());
vec.push_back(new DerivedB());
vec.push_back(new DerivedA());
vec.push_back(new DerivedB());
typedef BasePtr::iterator BaseIter;
for ( BaseIter it = vec.begin(); it != vec.end(); it++ ) {
if (it->getType() == 1) {
std::cout << it->getA() << '\n';
} else {
std::cout << it->getB() << '\n';
}
}
return 0;
}
问题
显然“它”既不被识别为 DerivedA 也不被识别为 DerivedB,因此无法访问子特定方法。需要某种形式的演员表,所以我想问题是:
如何正确地将迭代器转换为正确的派生类?
也许有更好的方法来构建整个场景?
编辑: 似乎我有点不清楚。派生类中方法的目的是根本不同的。考虑具有派生类 Armor 和 Weapon 的基类 Item。
在这个例子中,你可以看到为什么,例如,Weapon 有一个函数 getDamage(),它可能会返回一个浮点数。
Armor不需要此功能,甚至没有类似的功能。
在此示例中,您可以将向量视为可以包含任意数量和类型的项目的库存。甚至可能有堆叠和一些用途的物品(可能是药水)