说:
Apple源自基础Fruit Class,然后有一个ApplePicker类派生自基础FruitPicker类
ApplePicker类有vector<Apple> appleList
,Fruit picker类有一个指向vector<Fruit>
的指针,即vector<fruit>* fruitList
。
我需要能够将向量设置为此指针,因此抽象方法可以在水果选择器类中运行(因为它们只关注水果成员)。但是当我尝试这样做时,我无法设置它:
this->fruitList = &(this->AppleList);
它给了我错误cannot convert to vector<Apple> to vector<Fruit>
。我试过静态演员,它给了我同样的错误。我对非向量基类和派生类做了类似的事情,它很好。
我是C ++的新手,我通过NDK在Android上使用它。
所以我试图做的事情是不可能的,我必须使用像vector<Fruit*>
这样的指针向量。
答案 0 :(得分:3)
考虑一下:如果vector<Apple>
可以替换vector<Fruit>
(换句话说,如果您希望发生的转化实际上是合法的),那么您可以在输入中提供vector<Apple>
期望vector<Fruit>
的函数。
期望vector<Fruit>
的函数可能会向该向量添加Banana
,因为Banana
是Fruit
(暂时忽略了你会得到的事实) 切片如果你的向量存储类型Fruit
的对象而不是指向这些对象的指针,但这是一个不同的故事)。如果您将vector<Apple>
传递给该函数,则会破坏vector<Apple>
的不变量(即,它只能包含苹果)。
OOP中的继承适用于一种类型能够普遍替换另一种类型的情况,A
可以替换B
这一事实并不意味着V<A>
可以替换V<B>
1}}。
如果您需要编写适用于这两种向量的通用例程,请使用模板来实现编译时的通用性。