OO:如何创建一个函数"addFruit"来将水果添加到vector <fruit>中

Jos*_*son 2 c++ oop

我有:

class fruit
{
}

class apple:fruit
{
}

class pear:fruit
{
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个函数"addFruit"来将水果添加到水果矢量中.喜欢:

vector<fruit> fruits;
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

编辑:我尝试在基类中放置一个虚函数.并在子类中执行真正的操作.但它失败了.我遇到了很多错误.所以我只需要一个清晰的想法和示例代码片段.

sno*_*kin 5

Hmmmm .....

vector<fruit*> fruits;

fruits.push_back(new apple());
fruits.push_back(new pear());
Run Code Online (Sandbox Code Playgroud)

等等?那是你在找什么?


Mik*_*ley 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;
}
Run Code Online (Sandbox Code Playgroud)

您需要使用指向基类(Fruit*)的指针才能利用动态调度.否则,它只会调用Fruit的Eat()方法.

我的答案中的示例允许从Fruit派生的类在需要时覆盖Eat(),但这不是必需的.如果使虚函数为纯,则派生类必须实现它.

class Fruit
{
public:
    // Cannot instantiate this class, and derived classes must provide this
    virtual void Eat() = 0; 
};
Run Code Online (Sandbox Code Playgroud)

关于Donotalo的评论,您想要的功能可以实现为:

class FruitCollection
{
private:
    std::vector<Fruit *> fruits;

public:
    void Add(Fruit *fruit);
};

void FruitCollection::Add(Fruit *fruit)
{
    fruits.push_back(fruit);
}
Run Code Online (Sandbox Code Playgroud)

在大多数情况下,这可能是过度的,你可能需要比这个非常简单的例子更多的操作.