2015-01-20 75 views
0

我有一个名为“block”的类,它从名为“MainObject”的类继承。调用列表中的子对象

然后我创建了一个列表并添加“块”。我也使用迭代器来循环;

std::list<MainObject> objList; 

objList.push_back(block()); 
std::list<MainObject>::iterator p = objList.begin(); 

但是当我循环思考列表我只能调用MainObject的函数。 这是我的循环

for (p = objList.begin(); p != objList.end(); p++){ 
     p->Update(); 
} 
+0

当你迭代你的'objList'时,你怎么知道你是在处理一个'block'还是'MainObject'?如果你想要一个块列表,为什么不声明你的列表? 'std :: list '。你需要提供更多的上下文。 – Julian 2015-01-20 19:26:44

+0

这是因为我想添加更多的对象类型到列表中。所有对象都有一个Update函数,必须在每一帧都调用它。 – SaschaDeWaal 2015-01-20 19:39:16

+0

马特的回答下面应该做你需要的。有了最近评论中的额外信息,请注意,如果'MainObject'具有** virtual **'Update'方法,则不再需要强制转换,并且只需执行'p-> Update()'。 – Julian 2015-01-20 19:50:22

回答

2

您使用的是存储在列表中,而不是继承“块”对象acctual MainObject。你应该使用基本指针:

 std::list<MainObject* > objList; 

     objList.push_back(new block()); 
     for (p = objList.begin(); p != objList.end(); p++){ 
      block* b = dynamic_cast<block*>(p); 
      if (b) 
      b->Update(); 
} 

如果使用std::list<MainObject>objList.push_back将创建输入参数的副本,并存储MainObject,不那么继承类型,这就是为什么你只能叫MainObject的功能。

但是,当列表存储基类的指针时,它应该只调用基类的函数。将其转换为子类型并调用子类型的功能并不是一个好设计。基类就像一个合同,这种行为打破了合同。

+0

如果'* p'不是'block'的实例会发生什么? – Julian 2015-01-20 19:32:41

+0

@ AtlasC1,好点。更新了我的答案。 – Matt 2015-01-20 19:40:37

+0

好东西; +1! – Julian 2015-01-20 19:43:07

相关问题