Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
继承对象列表-C++_C++_Polymorphism - Fatal编程技术网

继承对象列表-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动态分配对象会更好,但总体思路是这样的。