我有:
class fruit
{
}
class apple:fruit
{
}
class pear:fruit
{
}
我想创建一个函数“addFruit”来将水果添加到水果矢量中。 像:
vector<fruit> fruits;
我该怎么做?
编辑: 我尝试在基类中放置一个虚函数。并在子类中执行真正的操作。但它失败了。我遇到了很多错误。所以我只需要一个清晰的想法和示例代码片段。
答案 0 :(得分:5)
Hmmmm .....
vector<fruit*> fruits;
fruits.push_back(new apple());
fruits.push_back(new pear());
等? 那是你在找什么?
答案 1 :(得分:5)
要正确使用继承,您需要执行以下操作:
#include <iostream>
#include <vector>
class Fruit
{
public:
virtual void Eat()
{
std::cout << "Mmm.. a fruit!" << std::endl;
}
virtual ~Fruit() {}
};
class Apple : public Fruit
{
public:
void Eat()
{
std::cout << "Mmm.. an apple!" << std::endl;
}
};
class Pear : public Fruit
{
public:
void Eat()
{
std::cout << "Mmm.. a pear!" << std::endl;
}
};
int main()
{
std::vector<Fruit *> fruits;
fruits.push_back(new Pear());
fruits.push_back(new Apple());
fruits.push_back(new Fruit());
for (int i = 0; i < fruits.size(); i++)
fruits[i]->Eat();
return 0;
}
您需要使用指向基类(Fruit *)的指针才能利用动态调度。否则,它只会调用Fruit的Eat()方法。
我的回答中的示例允许派生自Fruit的类在需要时覆盖Eat(),但这不是必需的。如果使虚函数为纯,则派生类必须实现它。
class Fruit
{
public:
// Cannot instantiate this class, and derived classes must provide this
virtual void Eat() = 0;
};
关于Donotalo的评论,您想要的功能可以实现为:
class FruitCollection
{
private:
std::vector<Fruit *> fruits;
public:
void Add(Fruit *fruit);
};
void FruitCollection::Add(Fruit *fruit)
{
fruits.push_back(fruit);
}
在大多数情况下,这可能有点过头了,你可能需要比这个非常简单的例子更多的操作。