c++不同类的数组/列表

标签 c++ arrays list pointers polymorphism

我在 C++ 中没有做过多的多态性,而且我已经有很长时间没有用其他语言做过了,所以我想要一些关于我试图实现的目标是否有可能的输入。

我有一个“实体”类,以及其他几个继承实体的“专用”子类。这些子类都有完全不同的方法(不是覆盖/重新实现相同的方法),因为它们需要执行不同的功能。

我正在寻找一种将所有这些“实体”组织到一个列表中的方法。如果我要创建一个“实体”类型的数组并将子类分配给该数组,我将无法再调用任何子类函数,只能调用父“实体”函数。

我能立即想到的唯一困惑的方法是为每个子类创建一个数组,当我想到我打算制作的子类的数量时,这似乎一点也不整洁,更不用说应用程序需要分配的内存量。

有什么方法可以干净地实现类似于我正在尝试做的事情吗?

最佳答案

如果您的 Entity 子类确实做完全不同的事情,那么可能值得重新审视您的设计。

解决这个问题的最好方法是在 Entity 基类上添加一个(也许是纯的)虚方法,比如

struct Entity
{
    virtual void do_stuff() = 0;
    virtual ~Entity() {}
};

struct En1 : public Entity
{
    // En1-specific methods
    void method1();
    void method2();

    // Override
    void do_stuff() override {
         method1();
         method2();
    }
};

然后您可以创建一个数组,其中包含指向 Entity 的指针,即

std::vector<std::unique_ptr<Entity>> vec;
vec.emplace_back(new En1);
vec.emplace_back(new En2);
for (auto&& e : vec) {
    e->do_stuff();
}

另一种方法是尝试使用 dynamic_casttypeid 来确定您在运行时处理的是哪个子类,但这很脆弱且难以扩展 future ,当然不推荐。

关于c++不同类的数组/列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26228413/

相关文章:

list - 我可以在 Groovy 和 Grails 中同时使用 IN 和 findBy 吗?

C++成员函数模板的隐式实例化

c++ - 键入循环时如何修复 visual studio 自动完成?

c++ - QTreeView:多级列的层次上下文

c++ - 可扩展的基类方法?

javascript - 如何过滤对象数组但更改顺序

c - 使用带有指针的数组,如何使用选择排序对数字进行排序?

php - 为什么我不能在 foreach 循环中将元素插入子数组?

python - 列表列表转换为 pandas DataFrame

python - 字典中的关系元组列表