在我的程序中,我有一个带有许多继承类的基类。我需要存储这些继承对象(或任何容器)的列表。我能想到的唯一方法是拥有一个带有某种类型枚举的基类列表,然后向下转换为继承的类型。
仅仅试图将我的对象放在某个容器中,不得不不断地投射我的对象似乎是一种沉重的惩罚。
还有其他选择吗?选角并没有看起来那么糟糕吗?
谢谢您的帮助!
在我的程序中,我有一个带有许多继承类的基类。我需要存储这些继承对象(或任何容器)的列表。我能想到的唯一方法是拥有一个带有某种类型枚举的基类列表,然后向下转换为继承的类型。
仅仅试图将我的对象放在某个容器中,不得不不断地投射我的对象似乎是一种沉重的惩罚。
还有其他选择吗?选角并没有看起来那么糟糕吗?
谢谢您的帮助!
通过虚函数使用多态性,这就是它们的用途:
#include <algorithm>
#include <functional>
#include <iostream>
#include <list>
using namespace std;
class A {
public:
virtual void print() {
cout << "This is an A object" << endl;
}
};
class B : public A {
public:
virtual void print() {
cout << "This is a B object" << endl;
}
};
class C : public A {
public:
virtual void print() {
cout << "This is a C object" << endl;
}
};
class D : public B {
// empty
};
int main() {
std::list<A*> objects;
objects.push_back(new A());
objects.push_back(new B());
objects.push_back(new C());
objects.push_back(new D());
for_each(objects.begin(), objects.end(), mem_fun(&A::print));
return 0;
}
// outputs:
// This is an A object
// This is a B object
// This is a C object
// This is a B object
没有直接支持的方式以编程方式获取基类的所有子类的列表。
您可以在代码中通过调用某个函数来注册每个子类来“宣布”自己,并让该函数接受/存储所需的数据。
但是,如果您不断地将对象从基类转换为派生类,那么您可能没有充分利用多态性。