-6ren"> -我有: class fruit { } class apple:fruit { } class pear:fruit { } 我想创建一个函数“addFruit”来将水果添加到水果 vector 中。-6ren">
gpt4 book ai didi

c++ - 面向对象 : how to create a function "addFruit" to add fruit into a vector

转载 作者:太空狗 更新时间:2023-10-29 23:42:10 24 4
gpt4 key购买 nike

我有:

class fruit
{
}

class apple:fruit
{
}

class pear:fruit
{
}

我想创建一个函数“addFruit”来将水果添加到水果 vector 中。喜欢:

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

在大多数情况下,这可能有点矫枉过正,您可能需要比这个极其简单的示例更多的操作。

关于c++ - 面向对象 : how to create a function "addFruit" to add fruit into a vector<fruit>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5602435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com