OO:如何创建函数"addFruit"将水果添加到向量<fruit>中

OO: how to create a function "addFruit" to add fruit into a vector<fruit>

本文关键字:添加 向量 lt gt fruit 何创建 创建 addFruit 函数 OO      更新时间:2023-10-16

我有:

class fruit
{
}
class apple:fruit
{
}
class pear:fruit
{
}

我想创建一个函数"addFruit"添加水果到水果向量。如:

vector<fruit> fruits;

我该怎么做?

编辑:我试着在基类中放一个虚函数。在子类中做真正的操作。但它失败了。我犯了很多错误。所以我只需要一个清晰的想法和示例代码片段。

要正确使用继承,您需要这样做:

#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);
}

在大多数情况下这可能是多余的,您可能需要比这个极其简单的示例更多的操作。

唔唔唔.....

vector<fruit*> fruits;
fruits.push_back(new apple());
fruits.push_back(new pear());

等等?这就是你想要的吗?