C++ 多态性和 vector ,将 vector 的派生类指向 vector 的基类

标签 c++ pointers vector polymorphism

说: 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 ,因为BananaFruit (暂时忽略如果您的 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/

相关文章:

loops - vhdl比较向量输出

C++ 和++ 运算符

arrays - 在函数中使用字符串数组

C++:在 C 或 C++ 中以普通文本模式(非二进制)写入 vector 文件以输出最快

c++ - vector 迭代器不兼容错误

c++ - 将成员函数指针与 0 进行比较是否总是有效的 C++?

c++ - (void) sizeof (0[array]) 是什么意思?

c++ - 为什么/MD 是编译器的选项?不是链接器的?

c++ - 相对于 bst 理解 shared_ptr

c - 指向结构的指针声明会为其成员分配内存吗?