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

时间:2014-10-07 04:09:34

标签: c++ arrays list pointers polymorphism

我在c ++中没有做太多的多态性,自从我用其他语言做了很长时间以来,所以我想要了解一下我是否能够做到这一点。我试图实现甚至可能。

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

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

我能立即想到的唯一混乱的方法是为每个子类创建一个数组,当我想到我打算制作的子类的数量时,它看起来并不整齐,而不是提到应用程序需要分配的内存量。

有没有办法干净地实现类似于我尝试做的事情?

2 个答案:

答案 0 :(得分:2)

如果您的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来确定您在运行时处理哪个子类,但这很脆弱,将来难以扩展,当然也不会推荐使用。

答案 1 :(得分:1)

创建您希望的任何派生类的对象,然后将地址存储在实体指针数组中。

使用dynamic_caststatic_cast运算符将数组中的指针向下转换为相应的派生类,并使用此类型指针调用派生类方法。