C ++来自派生类和基类的来回转换

时间:2011-03-14 00:05:18

标签: c++ casting

我想知道C ++中是否有办法完成以下任务:

我有一个名为ResultBase的基类和两个派生自它的类,VariableExpression。我有一些方法适用于vector<ResultBase>。我希望能够将VariableExpression的向量传递到这些方法中。我可以通过创建vector<ResultBase>并使用static_cast来填充变量/表达式向量中的成员来实现此目的。但是,一旦向量运行了这些方法,我希望能够将它作为Result / Expression的向量返回。我肯定知道我要回哪一个。 static_cast在这里不起作用,因为没有方法从ResultBase重建变量/表达式,更重要的是我没有变量/表达式的原始属性

这些方法修改了ResultBase的一些属性,我需要将这些更改反映在原始向量中。 (即ResultBase有一个名为IsLive的属性,其中一个方法将修改此属性。我希望此IsLive值反映在用于创建{{1 }}

最简单的方法是什么?

2 个答案:

答案 0 :(得分:5)

vector<ResultBase *>应修复您的切片问题 - vector<ResultBase>永远不会包含从ResultBase派生的类,而是包含“切片”的副本,例如Expression复制ResultBase部分。

有关切片的详细说明,请参阅What is object slicing?

答案 1 :(得分:0)

一种可能性是将适用于vector<ResultBase>的功能更改为适用于vector<T>的功能模板,其中T为模板参数。为了更加通用,函数可能可以在一对迭代器上运行,而不是在特定的容器类型上运行。

您可以使用vector<Variable>vector<Expression>而不是vector<ResultBase>来呼叫他们,只要VariableExpression都是ResultBase的正确替代品{ {1}},作为派生类应该是。

或者,正如Erik所说,您可以使用指针来获取容器的多态行为。为了便于内存管理,智能指针或Boost ptr_vector的向量通常比原始指针向量更受欢迎。

没有办法将派生类的实例转换为基础,然后返回派生,同时保留其原始值,这几乎与将int转换为{{1}的原因完全相同然后回来,保留原始值。如果所有其他方法都失败了,您可以将使用修改后的char对象的东西放在一起,以某种方式更新原始ResultBaseVariable对象,并使用函数进行任何更改。