继承对象列表-C++
在我的程序中,我有一个基类和许多继承的类。我需要存储这些继承对象或任何容器的列表。我能想到的唯一方法是,拥有一个带有某种类型枚举的基类列表,然后向下转换为继承的类型 为了把我的物品放在某个容器里,不得不不断地投掷我的物品似乎是一个沉重的惩罚 还有其他选择吗?演员阵容不是看起来那么糟糕吗继承对象列表-C++,c++,polymorphism,C++,Polymorphism,在我的程序中,我有一个基类和许多继承的类。我需要存储这些继承对象或任何容器的列表。我能想到的唯一方法是,拥有一个带有某种类型枚举的基类列表,然后向下转换为继承的类型 为了把我的物品放在某个容器里,不得不不断地投掷我的物品似乎是一个沉重的惩罚 还有其他选择吗?演员阵容不是看起来那么糟糕吗 谢谢你的帮助 没有直接支持的方式以编程方式获取基类所有子类的列表 您可以在代码中通过调用某个函数让每个子类声明自己,并让该函数接受/存储所需的数据 但是,如果您经常将对象从基类强制转换为派生类,那么可能您没有充分
谢谢你的帮助 没有直接支持的方式以编程方式获取基类所有子类的列表 您可以在代码中通过调用某个函数让每个子类声明自己,并让该函数接受/存储所需的数据
但是,如果您经常将对象从基类强制转换为派生类,那么可能您没有充分利用多态性。通过虚拟函数使用多态性,这就是它们的用途:
#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
为什么需要将它们转换为基本类型?您可能应该改用虚拟函数,我不认为调用继承的方法而只引用基类是可能的。它不只是调用基本方法吗?我想我需要强制转换到继承的类来调用它的虚拟方法。我错了吗?是的,你错了,如果基方法被标记为virtual,那么继承的方法将始终被调用。有趣。那时我甚至不需要投。感谢David和Jem提供的知识。要使其发挥作用,您需要在列表中存储指针,最好是智能指针,而不是实际对象。否则,派生对象必须被实际复制到列表中,并且在这个过程中它们被分割成基本对象。这个例子有很多语法错误,也不起作用。将派生实例而不是指针复制到列表中会将它们分割为基本实例。已修复。是多任务处理,没有密切关注。我添加了必要的include,以便它能够真正编译。另外,请注意,mem_fn需要C++11或TR1。另外,std::list或not动态分配对象会更好,但总体思路是这样的。