我想知道C ++中是否有办法完成以下任务:
我有一个名为ResultBase
的基类和两个派生自它的类,Variable
和Expression
。我有一些方法适用于vector<ResultBase>
。我希望能够将Variable
和Expression
的向量传递到这些方法中。我可以通过创建vector<ResultBase>
并使用static_cast
来填充变量/表达式向量中的成员来实现此目的。但是,一旦向量运行了这些方法,我希望能够将它作为Result / Expression的向量返回。我肯定知道我要回哪一个。 static_cast在这里不起作用,因为没有方法从ResultBase
重建变量/表达式,更重要的是我没有变量/表达式的原始属性
这些方法修改了ResultBase
的一些属性,我需要将这些更改反映在原始向量中。 (即ResultBase
有一个名为IsLive
的属性,其中一个方法将修改此属性。我希望此IsLive
值反映在用于创建{{1 }}
最简单的方法是什么?
答案 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>
来呼叫他们,只要Variable
和Expression
都是ResultBase
的正确替代品{ {1}},作为派生类应该是。
或者,正如Erik所说,您可以使用指针来获取容器的多态行为。为了便于内存管理,智能指针或Boost ptr_vector
的向量通常比原始指针向量更受欢迎。
没有办法将派生类的实例转换为基础,然后返回派生,同时保留其原始值,这几乎与将int
转换为{{1}的原因完全相同然后回来,保留原始值。如果所有其他方法都失败了,您可以将使用修改后的char
对象的东西放在一起,以某种方式更新原始ResultBase
或Variable
对象,并使用函数进行任何更改。