我在c ++中没有做太多的多态性,自从我用其他语言做了很长时间以来,所以我想要了解一下我是否能够做到这一点。我试图实现甚至可能。
我有一个班级"实体",以及其他几个专业'继承实体的子类。这些子类都有完全不同的方法(不覆盖/重新实现相同的方法),因为它们需要执行不同的功能。
我正在寻找一种方法来组织所有这些"实体"到一个单一的列表。如果我要创建一个类型"实体"并将子类分配给数组,我将不再能够调用任何子类函数,只能调用父类"实体"功能。
我能立即想到的唯一混乱的方法是为每个子类创建一个数组,当我想到我打算制作的子类的数量时,它看起来并不整齐,而不是提到应用程序需要分配的内存量。
有没有办法干净地实现类似于我尝试做的事情?
答案 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_cast
或typeid
来确定您在运行时处理哪个子类,但这很脆弱,将来难以扩展,当然也不会推荐使用。
答案 1 :(得分:1)
创建您希望的任何派生类的对象,然后将地址存储在实体指针数组中。
使用dynamic_cast
或static_cast
运算符将数组中的指针向下转换为相应的派生类,并使用此类型指针调用派生类方法。