gpt4 book ai didi

c++ - 使用 ptr_vector 时访问派生类的方法

转载 作者:行者123 更新时间:2023-11-27 23:22:54 26 4
gpt4 key购买 nike

设置

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;};

};

目标

拥有一个包含两个派生类的对象的 vector ,然后能够访问子特定的方法。

当前的“解决方案”

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;
}

问题

显然,“it”未被识别为 DerivedA 或 DerivedB,因此无法访问子特定方法。需要某种形式的转换,所以我想问题是:

如何正确地将迭代器转换为正确的派生类?

也许有更好的方法来构建整个场景?

编辑:好像我有点不清楚。派生类中方法的目的根本不同。考虑具有派生类 Armor 和 Weapon 的基类 Item。

在这个例子中你可以看到为什么,例如,Weapon 有一个函数 getDamage() 可能会返回一个 float 。

Armor 不需要此功能,甚至没有任何类似功能。

在此示例中,您可以将 vector 视为可以包含任意数量和类型的项目的库存。甚至可能有堆叠和一些用途的元素(可能是药水)

最佳答案

如果您必须转换为派生,则意味着您的设计有问题。

但是如果你真的必须这样做(把它放在 for 循环中):

DerivedB * typeB = dynamic_cast< DerivedB * >( &*it );
if ( typeB != nullptr )
{
std::cout << typeB->getB() << '\n';
}

更好的方法是将 getB() 添加到接口(interface)中,并在 DerivedA 中实现它(它可以返回一些虚拟值,或者在确实需要时抛出)。

关于c++ - 使用 ptr_vector 时访问派生类的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11578957/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com