在我的程序中,我有一个包含许多继承类的基类。我需要存储这些继承对象(或任何容器)的列表。我能想到的唯一方法是通过使用某种枚举类型的Base类的列表,然后向下转换为继承类型。继承对象列表 - C++
不得不经常施放我的物体似乎是一个沉重的惩罚,只是试图让我的对象在一些容器中。
还有其他的选择吗?铸造不像看起来那么糟糕?
感谢您的帮助!
在我的程序中,我有一个包含许多继承类的基类。我需要存储这些继承对象(或任何容器)的列表。我能想到的唯一方法是通过使用某种枚举类型的Base类的列表,然后向下转换为继承类型。继承对象列表 - C++
不得不经常施放我的物体似乎是一个沉重的惩罚,只是试图让我的对象在一些容器中。
还有其他的选择吗?铸造不像看起来那么糟糕?
感谢您的帮助!
使用多态,这就是他们在那里什么:
#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
这个例子有很多语法错误,也不起作用。将派生实例(而不是指针)复制到“列表”中将它们切片到基本实例中。 – Wyzard 2012-04-17 01:08:56
固定。是多任务处理,并没有密切关注。 – keelerjr12 2012-04-17 01:15:41
我添加了必要的包含,以便它实际编译。另外,请注意其他读者,'mem_fn'需要C++ 11或TR1。 – Wyzard 2012-04-17 01:21:21
没有直接支持的以编程方式获取基类的所有子类的列表的方式。
你可以在你的代码中做到这一点,让每个子类通过对一些函数的调用进行注册,并获得该函数来接受/存储所需的数据。
但是,如果您不断将对象从基类转换为派生类,那么您可能没有充分利用多态性。通过虚拟函数
为什么你需要将它们转换成基本类型?您应该使用虚拟功能。 – 2012-04-17 00:45:53
我不认为有可能调用继承方法,只有基类的引用。它不会只是调用基本方法吗?我以为我需要投到继承类来调用它的虚拟方法。我错了吗? – 2012-04-17 00:48:56
是的,你错了,如果基本方法被标记为“虚拟”,将继续调用继承的方法。 – Jem 2012-04-17 00:50:17