#include <iostream>
#include <algorithm>
#include <vector>
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;
vector<derived_1> derived_1s;
vector<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';
}