4

说:Apple 是从一个基 Fruit Class 派生的,那么还有一个 ApplePicker 类是从一个 FruitPicker 基类派生的。
ApplePicker 类有vector<Apple> appleList,Fruit picker 类有一个指向vector<Fruit>ie的指针vector<fruit>* fruitList

我需要能够将向量设置为此指针,以便可以在水果采摘器类中运行抽象方法(因为它们只关心水果成员)。但是当我尝试这样做时,我无法设置它:

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

它给了我错误cannot convert to vector<Apple> to vector<Fruit>。我尝试了静态转换,它给了我同样的错误。我对非向量基类和派生类做了类似的事情,这很好。

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

所以我想要做的事情是不可能的,我必须使用一个指针向量,比如vector<Fruit*>.

4

1 回答 1

4

想一想:如果vector<Apple>可以替代vector<Fruit>(换句话说,如果您期望发生的转换实际上是合法的),那么您可以为vector<Apple>期望 a 的函数提供 a in 输入vector<Fruit>

期望 a 的函数很vector<Fruit>可能将 a 添加Banana到该向量中,因为Banana是 a Fruit(暂时忽略这样一个事实,即如果您的向量存储类型的对象而不是指向此类对象的指针,您将得到切片Fruit,但这是另一回事) . 如果您将 a 传递vector<Apple>给该函数,您将打破 of 的不变量vector<Apple>(即它只能包含苹果的事实)。

OOP 中的继承适用于一种类型能够普遍替代另一种类型的情况,并且可以替代的事实A并不B意味着V<A>可以替代V<B>

如果您需要编写适用于这两种向量的通用例程,请使用模板来实现编译时通用性。

于 2013-04-06T10:20:20.640 回答