2011-03-14 46 views
0

我想知道來回轉換,如果有C++中的方式來完成以下操作:從它們它,Variable和衍生C++衍生自和基類

我有一個基類稱爲ResultBase和兩個類Expression。我有幾種方法可以在vector<ResultBase>上工作。我希望能夠將VariableExpression的載體傳遞到這些方法中。我可以通過創建一個vector<ResultBase>並使用static_cast來填充來自我的變量/表達式向量的成員。但是,一旦矢量已經遍歷這些方法,我希望能夠將其作爲Result/Expression的向量返回。我會確切地知道我想要回到哪一個。由於沒有方法來重建ResultBase中的變量/表達式,並且更重要的是我不具有變量/表達式的原始屬性,所以static_cast在此處不起作用,因爲這些方法修改了某些屬性的ResultBase,我需要將這些更改反映到原始向量中。 (即ResultBase有一個名爲IsLive屬性,方法之一將修改該屬性。我想反映在用於創建派生類此IsLiveResultBase

請告訴我最簡單的方法來做到這一點?

回答

5

vector<ResultBase *>應該解決您的切割問題 - 一個vector<ResultBase>永遠不會包含從ResultBase派生類,而是將複製通過複製它的ResultBase部分「切掉」,例如Expression

What is object slicing?的詳細解釋。切片。

+0

這當然是正確的,但我認爲OP知道它:*更重要的是,我不會擁有Variables/Expressions *的原始屬性。 – Jon 2011-03-14 00:11:06

+0

@Jon:更好地解釋太多而不是太少 - 下一個在搜索中找到答案的人可能*不知道 – Erik 2011-03-14 00:11:59

+0

同意。我只是說這個答案對於OP來說可能並不是非常有用。 – Jon 2011-03-14 00:13:29

0

一種可能性是將在vector<ResultBase>上運行的功能更改爲在vector<T>上運行的功能模板,其中T爲模板參數。爲了更通用,也許函數可以在一對迭代器上操作,而不是特定的容器類型。

然後,您可以打電話給他們用vector<Variable>vector<Expression>代替vector<ResultBase>,只要VariableExpression都是合適的替代ResultBase,作爲一個派生類應該的。

另外,正如Erik所說,你可以使用指針來獲取容器的多態行爲。爲了便於內存管理,智能指針矢量或Boost ptr_vector通常比原始指針向量更受歡迎。

有沒有辦法轉換一個派生類的實例,以基地,然後返回到衍生,同時保留其原始值,對於幾乎同樣的原因,它無法從int轉換爲char,然後返回,保存原始值。如果一切都失敗了,你也許可以在一起使用修改後的ResultBase對象一起躲閃,以某種方式更新原始的VariableExpression對象,並對這些對象進行任何更改。