2013-04-06 32 views
3

說: Apple是從基類Fruit Class派生的,然後是從基礎FruitPicker類派生的ApplePicker類。
ApplePicker類具有vector<Apple> appleList,水果選取器類具有指向vector<Fruit>的指針,即vector<fruit>* fruitListC++多態性和向量,將派生類的向量指向基類的向量

我需要能夠將矢量設置爲這個指針,所以抽象方法可以在水果選取器類中運行(因爲它們只關心水果成員)。但我無法設置此,當我試圖做到這一點:

this->fruitList = &(this->AppleList); 

它給我的錯誤cannot convert to vector<Apple> to vector<Fruit>。我嘗試了靜態轉換,它給了我同樣的錯誤。我做了一個類似的東西,非矢量基類和派生類,它很好。

我是C++新手,我通過NDK在Android上使用它。

所以是我想要做的不可能的,我必須使用像vector<Fruit*>指針向量。

+1

它不能完成,而是可以將迭代器傳遞給基類型。你以後稱之爲協變類型,我相信C#可以做到這一點。另外我會使用對矢量的引用而不是指針。 – paulm 2013-04-06 10:18:01

+1

[一袋蘋果不是一袋水果](https://www.google.com/search?q=%22a+bag+of+apples+is+not+a+bag+of+fruit%22 )。 – 2013-04-06 10:22:17

回答

3

想想看:如果vector<Apple>可以替代vector<Fruit>(換句話說,如果你期待發生的轉換實際上是合法的),那麼你可以提供輸入vector<Apple>給需要一個vector<Fruit>的功能。

期望一個vector<Fruit>可能添加Banana到向量,因爲BananaFruit的函數(忽略暫時的事實,你會得到切片如果您的向量存儲Fruit類型,而不是指針的對象這樣的對象,但這是一個不同的故事)。如果您將vector<Apple>傳遞給該函數,則會打破vector<Apple>的不變量(即,它只能包含蘋果)。在OOP

繼承適用於那些情況下,一類是可以普遍代替另一種類型,而事實上,A可以替代B並不意味着V<A>可以替代V<B>

如果您需要編寫一個適用於這兩種矢量的通用例程,請使用模板來實現編譯時的通用性。

相關問題