#include <iostream>
#include <algorithm>
#include <vector>
#include <deque>

struct base {
  virtual ~base(){}
  virtual int foo()=0;
};
struct derived_1 : base {
  derived_1() : data(1){}
  int data;
  virtual int foo(){return data++;}
};
struct derived_2 : base {
  derived_2() : data1(1), data2(1) {}
  int data1;
  int data2;
  virtual int foo(){return --data1+ ++data2;}
};

int main()
{
  using namespace std;
  const int howmany  = 10*1000;
  const int howoften = 10*1000;

  deque<derived_1> derived_1s;
  deque<derived_2> derived_2s;

  for (int i=0; i<howmany; ++i)
    derived_1s.push_back(derived_1());
  for (int i=0; i<howmany; ++i)
    derived_2s.push_back(derived_2());
  
  vector<base*> foo; // Enthält passende Zeiger auf Elemente in derived_1s und derived_2s

  for (int i=0; i<howmany; ++i) {
    foo.push_back(&derived_1s[i]);
    foo.push_back(&derived_2s[i]);
  }

  int sum = 0;
  for (int i=0; i<howoften; ++i) {
    for (base* b : foo) {
      sum += b->foo();
    }
  }
  std::cout << sum << '\n';
}

