在下面的代码中,我只是尝试使用异构 std::list 进行试验,其中我将三个派生类对象存储在 Base* 类型的列表中。从列表中检索数据时,我遇到了一些问题。我该怎么做呢?下面的代码有效,因为所有三个类的定义都是相同的。所以编译器以某种方式设法给了我预期的输出。
#include <list>
#include <iostream>
#include <string.h>
class Base;
typedef std::list<Base*> any_list;
class Base{};
class Derived1 : public Base
{
public:
std::string s;
Derived1():s("D1"){}
};
class Derived2 : public Base
{
public:
std::string s;
Derived2():s("D2"){}
};
class Derived3 : public Base
{
public:
std::string s;
Derived3():s("D3"){}
};
int main(int argc, char **argv) {
any_list l;
l.push_back(new Derived1);
l.push_back(new Derived2);
l.push_back(new Derived3);
for(any_list::iterator itr=l.begin();itr!=l.end();++itr)
std::cout<<((Derived1*)*itr)->s;
}
请注意 o/p 是 -
D1 D2 D3
现在,如果我在任何类中添加一个额外的成员,这将不起作用(这是预期的和正确的)。那么我应该如何对数据进行类型转换并从异构列表中检索它呢?我在这里错过了什么吗?