Спасибо, Bell.
B>Обратная процедура практически ничем не отличается (за исключением того, что здесь использование dynamic_cast оправдано):
B>B>std::vector <Base*> :: iterator BsItr = BsVec.begin();
B>Child1* p1 = dynamic_cast<Child1*>(*BsItr);
B>if(p1)
B>{
B> std::vector <Child1*> :: iterator Ch1Itr = std::find(Ch1Vec.begin(), Ch1Vec.end(), p1);
B> ...
B>}
B>else
B>{
B> std::vector <Child2*> :: iterator Ch2Itr = std::find(Ch2Vec.begin(), Ch2Vec.end(), static_cast<Child2*>(*BsItr));
Здесь тоже надо dynamic_cast?
B>}
B>
B>ЗЫ
B>Почему используется std::vector, а не тот же std::set?
Использую обращение по индексу. Подходящей функции сравнения элементов нет.