说:
Apple 派生自 Fruit 基类,然后有一个 ApplePicker 类派生自 FruitPicker 基类。
ApplePicker 类有 vector<Apple> appleList
, Fruit picker 类有一个指向 vector<Fruit>
的指针即 vector<fruit>* fruitList
.
我需要能够将 vector 设置为这个指针,所以抽象方法可以在水果采摘类中运行(因为它们只与水果成员有关)。但是当我尝试这样做时,我无法设置它:
this->fruitList = &(this->AppleList);
它给我错误 cannot convert to vector<Apple> to vector<Fruit>
.我尝试了静态转换,它给了我同样的错误。我对非 vector 基类和派生类做了类似的事情,没问题。
我是 C++ 的新手,我正在通过 NDK 在 Android 上使用它。
所以我想做的事情是不可能的,我必须使用像 vector<Fruit*>
这样的指针 vector .
最佳答案
想一想:如果vector<Apple>
可以替代vector<Fruit>
(换句话说,如果您期望发生的转换实际上是合法的),那么您可以提供 vector<Apple>
在输入到期望 vector<Fruit>
的函数中.
一个需要 vector<Fruit>
的函数可以添加一个 Banana
到那个 vector ,因为Banana
是 Fruit
(暂时忽略如果您的 vector 存储类型为 Fruit
的对象而不是指向此类对象的指针,您将得到 切片 的事实,但这是一个不同的故事)。如果你传递一个 vector<Apple>
对于该函数,您将破坏 vector<Apple>
的不变性(即它只能包含苹果这一事实)。
OOP 中的继承适用于一种类型能够普遍替代另一种类型的情况,并且 A
可以替代B
并不意味着 V<A>
可以替代V<B>
.
如果您需要编写适用于两种 vector 的通用例程,请使用模板来实现编译时通用性。
关于C++ 多态性和 vector ,将 vector 的派生类指向 vector 的基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15849639/