我在 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_cast
或 typeid
来确定您在运行时处理的是哪个子类,但这很脆弱且难以扩展 future ,当然不推荐。
关于c++不同类的数组/列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26228413/