gpt4 book ai didi

c++ - 区分 C++ 中基指针 vector 中的派生对象

转载 作者:行者123 更新时间:2023-11-27 23:46:07 27 4
gpt4 key购买 nike

跟进这个问题 Vector/Container comprised of different derived objects in C++我试图改进我的代码。现在我将指向派生对象的指针存储在单个 vector 中,但我不确定然后如何访问它们的派生类特定成员函数将单个 vector 拆分为子 vector 每个派生类型。

#include <vector>
#include <memory> // for unique_ptr
#include <iostream>

using namespace std;

class Fruit {};
class Banana: public Fruit { void cout_banana() { cout << "i am a banana" << endl; } };
class Apple : public Fruit { void cout_apple() { cout << "i am an apple" << endl; } };

class FruitBox
{
vector<unique_ptr<Banana>> vec_banana;
vector<unique_ptr<Apple>> vec_apple;

public:
FruitBox(const vector<unique_ptr<Fruit>> &fruits)
{
for (const unique_ptr<Fruit> &f : fruits)
{
// How to figure out if f is Banana or Apple and then
// 1) Print either cout_banana or cout_apple
// 2) Store/Move f in either vec_banana or vec_apple
}
}
};

void main()
{
vector<unique_ptr<Fruit>> inputs;
inputs.emplace_back(new Banana());
inputs.emplace_back(new Apple());

FruitBox fbox = FruitBox(inputs);
}

最佳答案

我认为您的问题不在于实现本身(可以使用 dynamic_cast 检查实际的类,但我不会在这里深入探讨,因为这是不必要的),而是您的理解首先是面向对象 - 至少在这个特定的例子中。

Liskov Substitution Principle声明 “如果 S 是 T 的子类型,则类型 T 的对象可以替换为类型 S 的对象(即类型 T 的对象可以替换为子类型 S 的任何对象)。” 这里不是这种情况。

与其在子类中定义 cout_xyz,不如将 void cout_fruit() 编写为 class Fruit 中的抽象方法,并在子类。

class Fruit { public: virtual void cout_fruit() = 0; };
class Banana: public Fruit { public: void cout_fruit() override { cout << "i am a banana" << endl; } };
class Apple : public Fruit { public: void cout_fruit() override { cout << "i am an apple" << endl; } };
// [...]

然后,对于每个水果,您只需调用 f->cout_fruit()

关于c++ - 区分 C++ 中基指针 vector 中的派生对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50463247/

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