将抽象基类转换为派生类的最佳实践?

时间:2015-09-27 15:45:17

标签: c++ pointers derived-class

我最近一直在研究PHP Bencode extension,我在BItemvector中存储了一系列抽象基类(ordered_map)的指针。在处理字典或Bencode中的列表时。

但是,我需要将指针转换回派生类(BDictBListBStrBInt),然后再将它们包装并返回给PHP。所以我定义了一个名为getType()的方法,并根据方法的返回值将基类指针映射到派生类的。

但是我经常使用地图,在我完成初始版本之后,在我的代码中可以找到相同的if-else语句,例如:

if (iter->second->getType() == "BDict") {
    BDict *current = new BDict(iter->second);
    retval += current->__toString().stringValue();
} else if (iter->second->getType() == "BList") {
    BList *current = new BList(iter->second);
    retval += current->__toString().stringValue();
} else if (iter->second->getType() == "BStr") {
    BStr *current = new BStr(iter->second);
    retval += current->__toString().stringValue();
} else if (iter->second->getType() == "BInt") {
    BInt *current = new BInt(iter->second);
    retval += current->__toString().stringValue();
}

这太糟糕了。老实说,我不是很擅长C ++,但我考虑了很多。使用像template<typename T> T* toChild(BItem *parent)这样的模板函数转换指针?不,编译器将无法确定返回类型。设置“me指针”并使用特定方法返回它?不,我不能使用具有不同返回类型的函数覆盖基类中的函数。

那么我怎样才能以更优雅的方式实现这个目标呢?

0 个答案:

没有答案