#include <iostream>
#include <vector>
class Base {
public:
virtual void go() {
std::cout << "I am the base class" << std::endl;
}
};
class DerA : public Base {
void go() {
std::cout << "I am the first derivative" << std::endl;
}
};
class DerB : public Base {
void go() {
std::cout << "I am the second derivative" << std::endl;
}
};
class UnrelatedClass {
public:
std::vector<Base*> vec;
void add_to_vec(Base* thing) {
vec.push_back(thing);
}
};
int main() {
Base base;
DerA dera;
DerB derb;
UnrelatedClass uc;
uc.add_to_vec(&base);
uc.add_to_vec(&dera);
uc.add_to_vec(&derb);
for (auto thing : uc.vec) {
thing->go();
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKY2xhc3MgQmFzZSB7CnB1YmxpYzoKICAgIHZpcnR1YWwgdm9pZCBnbygpIHsKICAgICAgICBzdGQ6OmNvdXQgPDwgIkkgYW0gdGhlIGJhc2UgY2xhc3MiIDw8IHN0ZDo6ZW5kbDsKICAgIH0KfTsKCmNsYXNzIERlckEgOiBwdWJsaWMgQmFzZSB7CiAgICB2b2lkIGdvKCkgewogICAgICAgIHN0ZDo6Y291dCA8PCAiSSBhbSB0aGUgZmlyc3QgZGVyaXZhdGl2ZSIgPDwgc3RkOjplbmRsOwogICAgfQp9OwoKY2xhc3MgRGVyQiA6IHB1YmxpYyBCYXNlIHsKICAgIHZvaWQgZ28oKSB7CiAgICAgICAgc3RkOjpjb3V0IDw8ICJJIGFtIHRoZSBzZWNvbmQgZGVyaXZhdGl2ZSIgPDwgc3RkOjplbmRsOwogICAgfQp9OwoKY2xhc3MgVW5yZWxhdGVkQ2xhc3MgewpwdWJsaWM6CiAgICBzdGQ6OnZlY3RvcjxCYXNlKj4gdmVjOwogICAgdm9pZCBhZGRfdG9fdmVjKEJhc2UqIHRoaW5nKSB7CiAgICAgICAgdmVjLnB1c2hfYmFjayh0aGluZyk7CiAgICB9Cn07CgppbnQgbWFpbigpIHsKICAgIEJhc2UgYmFzZTsKICAgIERlckEgZGVyYTsKICAgIERlckIgZGVyYjsKCiAgICBVbnJlbGF0ZWRDbGFzcyB1YzsKICAgIHVjLmFkZF90b192ZWMoJmJhc2UpOwogICAgdWMuYWRkX3RvX3ZlYygmZGVyYSk7CiAgICB1Yy5hZGRfdG9fdmVjKCZkZXJiKTsKCiAgICBmb3IgKGF1dG8gdGhpbmcgOiB1Yy52ZWMpIHsKICAgICAgICB0aGluZy0+Z28oKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQ==