2015-01-20 2 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', как вы узнаете, имеете ли вы дело с блоком или с объектом MainObject? Если вам нужен список блоков, почему бы не объявить список как таковой? 'std :: list '. Вам нужно предоставить еще несколько контекстов. – Julian

+0

Это потому, что я хочу добавить в список больше типов объектов. У всех объектов есть функция Update, которая должна быть вызвана каждым фреймом. – SaschaDeWaal

+0

Ответ Мэтта ниже должен делать то, что вам нужно. Обратите внимание, что в случае, если 'MainObject' имеет ** виртуальный **' Update' метод, литье больше не требуется, и вы можете просто сделать 'p-> Update()'. – Julian

ответ

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

+0

@ AtlasC1, хороший пункт. Обновлен мой ответ. – Matt

+0

Хороший материал; +1! – Julian