В идеале A
должен предоставлять виртуальный интерфейс, который позволяет вам получать доступ к нужным вам частям B
. Если вам нужен доступ к фактическим B
объектам, вам нужно будет использовать dynamic_cast
для ссылки, выданной итератором в контейнер (вы можете использовать static_cast
, если вы точно знаете, что итератор действительно указывает на B
объект):
// Create a container and insert a new element into it:
boost::ptr_vector<A> s;
s.push_back(new B());
// Get a reference to that element we just inserted:
B& b_ref = dynamic_cast<B&>(*s.begin());
Если вы хотите перебрать все элементы B
в контейнере (и пропустить все элементы, не являющиеся B
), вы можете сделать это довольно легко, используя комбинацию Boost's transform_iterator
(для преобразования каждого *). 1013 * до B&
) и filter_iterator
(чтобы пропустить все элементы, не являющиеся B
в контейнере).