2012-04-17 106 views
0

在我的程序中,我有一个包含许多继承类的基类。我需要存储这些继承对象(或任何容器)的列表。我能想到的唯一方法是通过使用某种枚举类型的Base类的列表,然后向下转换为继承类型。继承对象列表 - C++

不得不经常施放我的物体似乎是一个沉重的惩罚,只是试图让我的对象在一些容器中。

还有其他的选择吗?铸造不像看起来那么糟糕?

感谢您的帮助!

+4

为什么你需要将它们转换成基本类型?您应该使用虚拟功能。 – 2012-04-17 00:45:53

+0

我不认为有可能调用继承方法,只有基类的引用。它不会只是调用基本方法吗?我以为我需要投到继承类来调用它的虚拟方法。我错了吗? – 2012-04-17 00:48:56

+1

是的,你错了,如果基本方法被标记为“虚拟”,将继续调用继承的方法。 – Jem 2012-04-17 00:50:17

回答

6

使用多态,这就是他们在那里什么:

#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 
+0

这个例子有很多语法错误,也不起作用。将派生实例(而不是指针)复制到“列表”中将它们切片到基本实例中。 – Wyzard 2012-04-17 01:08:56

+0

固定。是多任务处理,并没有密切关注。 – keelerjr12 2012-04-17 01:15:41

+0

我添加了必要的包含,以便它实际编译。另外,请注意其他读者,'mem_fn'需要C++ 11或TR1。 – Wyzard 2012-04-17 01:21:21

1

没有直接支持的以编程方式获取基类的所有子类的列表的方式。

你可以在你的代码中做到这一点,让每个子类通过对一些函数的调用进行注册,并获得该函数来接受/存储所需的数据。

但是,如果您不断将对象从基类转换为派生类,那么您可能没有充分利用多态性。通过虚拟函数